📄 0440processcontrol.htm
字号:
-2 ∶代表与由键盘输入 [ctrl]-c 同样的动作;
-9 ∶立刻强制删除一个工作;
-15∶以正常的程序方式终止一项工作。与 -9 是不一样的。
范例∶</span>
<span class=term_hd>范例一∶找出目前的 bash 环境下的背景工作,并将该工作删除。</span>
[root@linux ~]# <span class=term_command>jobs</span>
[1]+ Stopped vim bashrc
[root@linux ~]# <span class=term_command>kill -9 %1</span>
[1]+ 已砍掉 vim bashrc
<span class=term_hd>范例∶找出目前的 bash 环境下的背景工作,并将该工作终止掉。</span>
[root@linux ~]# <span class=term_command>jobs</span>
[1]+ Stopped vim bashrc
[root@linux ~]# <span class=term_command>kill -SIGTERM %1</span>
[1]+ 终止 vim bashrc
<span class=term_say># -SIGTERM 与 -15 是一样的!您可以使用 kill -l 来查阅!</span>
</pre></td></tr></table>
特别留意一下, -9 这个 signal 通常是用在『强制删除一个不正常的工作』时所使用的,
-15 则是以正常步骤结束一项工作(15也是预设值),两者之间并不相同呦!举上面的例子来说,
我用 vi 的时候,不是会产生一个 .filename.swp 的档案吗?
那么,当使用 -15 这个 signal 时, vi 会尝试以正常的步骤来结束掉该 vi 的工作,
所以 .filename.swp 会主动的被移除,但若是使用 -9 这个 signal 时,
由于该 vi 工作会被强制移除掉,因此, .filename.swp 就会继续存在档案系统当中。
这样您应该可以稍微分辨一下了吧?<br><br>
其实, kill 的妙用是很无穷的啦!他搭配 signal 所详列的资讯 (用 man 7 signal 去查阅相关资料)
可以让您有效的管理工作与程序 (Process),此外,那个 killall 也是同样的用法!
至于常用的 signal 您至少需要了解 1, 9, 15 这三个 signal 的意义才好。
此外, signal 除了以数值来表示之外,也可以使用讯号名称喔!
举例来说,上面的范例二就是一个例子啦!至于 signal number 与名称的对应,
呵呵,使用 kill -l 就知道啦(L的小写)!
</div>
</div>
<hr><a NAME="process"></a><img src="images/penguin-m.gif" alt="大标题的图示" height="34" width="25" align="middle" /><span class="text_h1">程序管理</span><br>
<div class=block1>
本章一开始就提到所谓的『程序』的概念,包括程序的触发、子程序与父程序的相关性等等,
此外,还有那个『程序的相依性』以及所谓的『僵尸程序』等等需要说明的呢!
为什么程序管理这么重要呢?<ul>
<li>首先,由于我们在操作系统时,各项工作其实都是经过某个 PID 来达成的,
因此,能不能进行某项工作,就与该程序的权限有关了。
<li>再来,如果您的 Linux 系统是个很忙碌的系统,那么当整个系统资源快要被使用光时,
您是否能够找出最耗系统的那个程序,然后删除该程序,让系统恢复正常呢?
<li>此外,如果由于某个程式写的不好,导致产生一个有问题的程序在记忆体当中,
您又该如何找出他,然后将他移除呢?
<li>如果同时有五六项工作在您的系统当中运作,但其中有一项工作才是最重要的,
该如何让那一项重要的工作被最优先执行呢?</ul>
所以棉,一个称职的系统管理员,必须要熟悉程序的管理流程才行,否则当系统发生问题时,
还真是很难解决问题呢!当然啦,程序的管理其实也是很难理解的部分,
尤其讲到子程序与父程序之间的关系,更不容易理解。伤脑筋啊!无论如何,咱们还是得来看一看,
系统上面到底有多少程序在运作啊?<br><br>
<hr><a name=process_1></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>程序的观察</span><br>
<div class=block2>
既然程序这么重要,那么我们如何查阅系统上面正在运作当中的程序呢?很简单啊!
利用静态的 ps 或者是动态的 top,还能以 pstree 来查阅程序树之间的关系喔!<br><br>
<a name=ps><hr></a><li><span class=text_import1>ps</span></li>
<div class=block2>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>ps aux</span>
[root@linux ~]# <span class=term_command>ps -lA</span>
[root@linux ~]# <span class=term_command>ps axjf</span>
<span class=term_say>参数∶
-A ∶所有的 process 均显示出来,与 -e 具有同样的效用;
-a ∶不与 terminal 有关的所有 process ;
-u ∶有效使用者 (effective user) 相关的 process ;
x ∶通常与 a 这个参数一起使用,可列出较完整资讯。
输出格式规划∶
l ∶较长、较详细的将该 PID 的的资讯列出;
j ∶工作的格式 (jobs format)
-f ∶做一个更为完整的输出。
特别说明∶
由于 ps 能够支援的 OS 类型相当的多,所以他的参数多的离谱!
而且有没有加上 - 差很多!详细的用法应该要参考 man ps 喔!
范例∶</span>
<span class=term_hd>范例一∶将目前属于您自己这次登入的 PID 与相关资讯列示出来</span>
[root@linux ~]# <span class=term_command>ps -l</span>
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 5881 5654 0 76 0 - 1303 wait pts/0 00:00:00 su
4 S 0 5882 5881 0 75 0 - 1349 wait pts/0 00:00:00 bash
4 R 0 6037 5882 0 76 0 - 1111 - pts/0 00:00:00 ps
<span class=term_say># 上面这个资讯其实很多喔!各相关资讯的意义为∶
# F 代表这个程序的旗标 (flag), 4 代表使用者为 super user;
# S 代表这个程序的状态 (STAT),关于各 STAT 的意义将在内文介绍;
# PID 没问题吧!?就是这个程序的 ID 啊!底下的 PPID 则上父程序的 ID;
# C CPU 使用的资源百分比
# PRI 这个是 Priority (优先执行序) 的缩写,详细后面介绍;
# NI 这个是 Nice 值,在下一小节我们会持续介绍。
# ADDR 这个是 kernel function,指出该程序在记忆体的那个部分。如果是个 running
# 的程序,一般就是『 - 』的啦!
# SZ 使用掉的记忆体大小;
# WCHAN 目前这个程序是否正在运作当中,若为 - 表示正在运作;
# TTY 登入者的终端机位置棉;
# TIME 使用掉的 CPU 时间。
# CMD 所下达的指令为何!?
# 仔细看到每一个程序的 PID 与 PPID 的相关性为何喔!上头列出的三个程序中,
# 彼此间可是有相关性的呐!</span>
<span class=term_hd>范例二∶列出目前所有的正在记忆体当中的程序∶</span>
[root@linux ~]# <span class=term_command>ps aux</span>
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 1740 540 ? S Jul25 0:01 init [3]
root 2 0.0 0.0 0 0 ? SN Jul25 0:00 [ksoftirqd/0]
root 3 0.0 0.0 0 0 ? S< Jul25 0:00 [events/0]
<span class=term_say>.....中间省略.....</span>
root 5881 0.0 0.3 5212 1204 pts/0 S 10:22 0:00 su
root 5882 0.0 0.3 5396 1524 pts/0 S 10:22 0:00 bash
root 6142 0.0 0.2 4488 916 pts/0 R+ 11:45 0:00 ps aux
<span class=term_hd>范例三∶以范例一的显示内容,显示出所有的程序∶</span>
[root@linux ~]# <span class=term_command>ps -lA</span>
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 76 0 - 435 - ? 00:00:01 init
1 S 0 2 1 0 94 19 - 0 ksofti ? 00:00:00 ksoftirqd/0
1 S 0 3 1 0 70 -5 - 0 worker ? 00:00:00 events/0
<span class=term_say>.....以下省略.....</span>
<span class=term_hd>范例四∶列出类似程序树的程序显示∶</span>
[root@linux ~]# <span class=term_command>ps -axjf</span>
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
0 1 0 0 ? -1 S 0 0:01 init [3]
1 2 0 0 ? -1 SN 0 0:00 [ksoftirqd/0]
<span class=term_say>.....中间省略.....</span>
1 5281 5281 5281 ? -1 Ss 0 0:00 /usr/sbin/sshd
5281 5651 5651 5651 ? -1 Ss 0 0:00 \_ sshd: dmtsai [priv]
5651 5653 5651 5651 ? -1 S 500 0:00 \_ sshd: dmtsai@pts/0
5653 5654 5654 5654 pts/0 6151 Ss 500 0:00 \_ -bash
5654 5881 5881 5654 pts/0 6151 S 0 0:00 \_ su
5881 5882 5882 5654 pts/0 6151 S 0 0:00 \_ bash
5882 6151 6151 5654 pts/0 6151 R+ 0 0:00 \_ ps -axjf
<span class=term_say># 看出来了吧?其实鸟哥在进行一些测试时,都是以网路连线进主机来测试的,
# 所以棉,你会发现,嘿嘿!其实程序之间是有相关性的啦!不过,
# 其实还可以使用 pstree 来达成这个程序树喔!底下在仔细谈一谈。</span>
<span class=term_hd>范例五∶找出与 cron 与 syslog 这两个服务有关的 PID 号码?</span>
[root@linux ~]# <span class=term_command>ps aux | egrep '(cron|syslog)'</span>
root 1539 0.0 0.1 1616 616 ? Ss Jul25 0:03 syslogd -m 0
root 1676 0.0 0.2 4544 1128 ? Ss Jul25 0:00 crond
root 6157 0.0 0.1 3764 664 pts/0 R+ 12:10 0:00 egrep (cron|syslog)
<span class=term_say># 所以号码是 1539 及 1676 这两个棉!就是这样找的啦!</span>
</pre></td></tr></table>
说真的,如果你曾经使用 man ps 的话,呵呵!可能会被里面的说明搞的一脸茫然~
因为......支援的类型实在太多,所以, ps -aux 与 ps aux 显示的结果『可能』是不一样的,
那个 -u 后面接的是『有效的使用者 ID』,所以, -ux 可能是『有一个 user 名称为 x 』
而如果没有 x 这个使用者,那么萤幕上面会显示一个警告讯息,并以 ps aux 来输出。
哇!真是麻烦~所以,您可以直接记得使用 ps aux 就好了!<br><br>
在预设的情况下, ps 仅会列出与目前所在的 bash shell 有关的 PID 而已,所以,
当我使用 ps -l 的时候,只有三个 PID (范例一)。注意一下,我有一个 bash 的 PID ,
而且也有一个 ps 的 PID ,了解了吧?呵呵!在 bash 里面执行程式时,是会触发一个新的 process
的喔!而且,两者之间是有相关性的,看 PID 与 PPID 的号码,你就会晓得两者的差异了!<br><br>
那么,什么是『有效使用者 ID 』呢?还记得我们提过的 SUID 吧?我以 dmtsai
去执行 /usr/bin/passwd 取得的那个 process 竟然是 root 的权限喔!
此时,实际的使用者 (real user) 是 dmtsai ,但是有效的使用者 (effective user) 是 root 啦!
这样说,可以理解吧!?<br><br>
一般来说,鸟哥会建议您,直接使用『<span class=text_import2>ps aux</span>』这个指令参数即可,
显示的结果例如上面的范例二棉。在范例二的各个显示项目代表的意义为∶
<ul><font face="细明体">
<li>USER∶该 process 属于那个使用者帐号的?
<li>PID ∶该 process 的号码。
<li>%CPU∶该 process 使用掉的 CPU 资源百分比;
<li>%MEM∶该 process 所占用的实体记忆体百分比;
<li>VSZ ∶该 process 使用掉的虚拟记忆体量 (Kbytes)
<li>RSS ∶该 process 占用的固定的记忆体量 (Kbytes)
<li>TTY ∶该 process 是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6
是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网路连接进主机的程序。
<li>STAT∶该程序目前的状态,主要的状态有∶<ul>
<li>R ∶该程序目前正在运作,或者是可被运作;
<li>S ∶该程序目前正在睡眠当中 (可说是 idle 状态啦!),但可被某些讯号 (signal) 唤醒。
<li>T ∶该程序目前正在侦测或者是停止了;
<li>Z ∶该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态</ul>
<li>START∶该 process 被触发启动的时间;
<li>TIME ∶该 process 实际使用 CPU 运作的时间。
<li>COMMAND∶该程序的实际指令为何?
</font></ul>
我们取这一行来做个简单的说明∶<br>
<table class="term"><tr><td class="term"><pre>
root 5881 0.0 0.3 5212 1204 pts/0 S 10:22 0:00 su
</pre></td></tr></table>
该程序属于 root 所有,他的 PID 号码是 5881,该程序对于 CPU 的使用率很低啊!
至于占用的实体记忆体大概有 0.3% 这么多。至于该程序使用掉的虚拟记忆体量为 5212 K,
实体记忆体为 1204 K,该程序属于 pts/0 这个终端机,看来这个程序应该是来自网路的连线登入。
该程序目前是 Sleep 的状态,但其实是可以被执行的。这个程序由今天的 10:22 开始运作,
不过,仅耗去 CPU 运作时间的 0:00 分钟。该程序的执行就是 su 这个指令啦!<br><br>
除此之外,我们必须要知道的是『疆尸 (zombie) 』程序是什么?
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -