📄 0440processcontrol.htm
字号:
通常,造成疆尸程序的成因是因为该程序应该已经执行完毕,或者是因故应该要终止了,
但是该程序的父程序却无法完整的将该程序结束掉,而造成那个程序一直存在记忆体当中.....
如果您发现在某个程序的 CMD 后面还接上 <defunct> 时,就代表该程序是疆尸程序啦,例如∶<br>
<table class="term"><tr><td class="term"><pre>
apache 8683 0.0 0.9 83384 9992 ? Z 14:33 0:00 /usr/sbin/httpd <defunct>
</pre></td></tr></table>
当系统不稳定的时候就容易造成所谓的疆尸程序,可能原因是因为程式写的不好啦,
或者是使用者的操作习惯不良等等所造成。如果您发现系统中很多疆尸程序时,
呵呵!记得啊!要找出该程序的父程序,然后好好的做个追踪,好好的进行主机的环境最佳化啊!
看看有什么地方需要改善的,不要只是直接将他 kill 掉而已呢!
不然的话,万一他一直产生,那可就麻烦了! @_@<br><br>
</div>
<a name=top><hr></a><li><span class=text_import1>top</span></li>
<div class=block2>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>top [-d] | top [-bnp]</span>
<span class=term_say>参数∶
-d ∶后面可以接秒数,就是整个程序画面更新的秒数。预设是 5 秒;
-b ∶以批次的方式执行 top ,还有更多的参数可以使用喔!
通常会搭配资料流重导向来将批次的结果输出成为档案。
-n ∶与 -b 搭配,意义是,需要进行几次 top 的输出结果。
-p ∶指定某些个 PID 来进行观察监测而已。
在 top 执行过程当中可以使用的按键指令∶
? ∶显示在 top 当中可以输入的按键指令;
P ∶以 CPU 的使用资源排序显示;
M ∶以 Memory 的使用资源排序显示;
N ∶以 PID 来排序喔!
T ∶由该 Process 使用的 CPU 时间累积 (TIME+) 排序。
k ∶给予某个 PID 一个讯号 (signal)
r ∶给予某个 PID 重新制订一个 nice 值。
范例∶</span>
<span class=term_hd>范例一∶每两秒钟更新一次 top ,观察整体资讯∶</span>
[root@linux ~]# <span class=term_command>top -d 2</span>
top - 18:30:36 up 30 days, 7 min, 1 user, load average: 0.42, 0.48, 0.45
Tasks: 163 total, 1 running, 161 sleeping, 1 stopped, 0 zombie
Cpu(s): 4.7% us, 4.0% sy, 6.3% ni, 82.5% id, 0.4% wa, 0.1% hi, 2.0% si
Mem: 1033592k total, 955252k used, 78340k free, 208648k buffers
Swap: 1052216k total, 728k used, 1051488k free, 360248k cached
<span class=term_note><==如果加入 k 或 r 时,就会有相关的字样出现在这里喔!</span>
<span style="background-color:white; color:black"> PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND </span>
3981 apache 34 19 84012 11m 7352 S 17.3 1.2 0:00.09 httpd
1454 mysql 16 0 289m 40m 2228 S 3.8 4.0 115:01.32 mysqld
3985 dmtsai 15 0 2148 904 668 R 3.8 0.1 0:00.03 top
1 root 16 0 3552 552 472 S 0.0 0.1 0:08.90 init
2 root RT 0 0 0 0 S 0.0 0.0 0:52.76 migration/0
3 root 34 19 0 0 0 S 0.0 0.0 0:03.01 ksoftirqd/0
<span class=term_hd>范例二∶将 top 的资讯进行 2 次,然后将结果输出到 /tmp/top.txt</span>
[root@linux ~]# <span class=term_command>top -b -n 2 > /tmp/top.txt</span>
<span class=term_say># 这样一来,嘿嘿!就可以将 top 的资讯存到 /tmp/top.txt 档案中了。</span>
<span class=term_hd>范例三∶假设 10604 是一个已经存在的 PID ,仅观察该程序?</span>
[root@linux ~]# <span class=term_command>top -d 2 -p10604</span>
top - 13:53:00 up 51 days, 2:27, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0% us, 0.0% sy, 0.0% ni, 100.0% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 385676k total, 371760k used, 13916k free, 131164k buffers
Swap: 1020116k total, 880k used, 1019236k free, 95772k cached
<span style="background-color:white; color:black"> PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND </span>
10604 root 16 0 5396 1544 1244 S 0.0 0.4 0:00.07 bash
<span class=term_hd>范例四∶承上题,上面的 NI 值是 0 ,想要改成 10 的话?</span>
<span class=term_say># 在范例三的 top 画面当中直接按下 r 之后,会出现如下的图样!</span>
top - 13:53:00 up 51 days, 2:27, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0% us, 0.0% sy, 0.0% ni, 100.0% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 385676k total, 371760k used, 13916k free, 131164k buffers
Swap: 1020116k total, 880k used, 1019236k free, 95772k cached
PID to renice: <span class=term_write>10604</span>
<span style="background-color:white; color:black"> PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND </span>
10604 root 16 0 5396 1544 1244 S 0.0 0.4 0:00.07 bash
<span class=term_say># 之后,可以输入 nice 值了!</span>
top - 13:53:00 up 51 days, 2:27, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0% us, 0.0% sy, 0.0% ni, 100.0% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 385676k total, 371760k used, 13916k free, 131164k buffers
Swap: 1020116k total, 880k used, 1019236k free, 95772k cached
Renice PID 10604 to value: <span class=term_write>10</span>
<span style="background-color:white; color:black"> PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND </span>
10604 root 30 10 5396 1544 1244 S 0.0 0.4 0:00.07 bash
</pre></td></tr></table>
top 也是个挺不错的程序观察工具!但不同于 ps 是静态的结果输出, top
这个程式可以持续的监测 (monitor) 整个系统的程序工作状态,例如上面的范例一所示啊!
在预设的情况下,每次更新程序资源的时间为 5 秒,不过,可以使用 -d 来进行修改。<br><br>
top 主要分为两个画面,上面的画面为整个系统的资源使用状态,基本上总共有六行,
显示的内容依序是∶<ul>
<li>第一行∶显示系统已启动的时间、目前上线人数、系统整体的负载(load)。
比较需要注意的是系统的负载,三个数据分别代表 1, 5, 10 分钟的平均负载。
一般来说,这个负载值应该不太可能超过 1 才对,除非您的系统很忙碌。
如果持续高于 5 的话,那么.....仔细的看看到底是那个程序在影响整体系统吧!</li><br>
<li>第二行∶显示的是目前的观察程序数量,比较需要注意的是最后的 zombie 那个数值,如果不是 0
,嘿嘿!好好看看到底是那个 process 变成疆尸了吧?!</li><br>
<li>第三行∶显示的是 CPU 的整体负载,每个项目可使用 ? 查阅。需要观察的是 id (idle)
的数值,一般来说,他应该要接近 100% 才好,表示系统很少资源被使用啊! ^_^。</li><br>
<li>第四行与第五行∶表示目前的实体记忆体与虚拟记忆体 (Mem/Swap) 的使用情况。</li><br>
<li>第六行∶这个是当在 top 程式当中输入指令时,显示状态的地方。
例如范例四就是一个简单的使用例子。</ul>
至于 top 底下的画面,则是每个 process 使用的资源情况。比较需要注意的是∶<ul>
<li>PID ∶每个 process 的 ID 啦!
<li>USER∶该 process 所属的使用者;
<li>PR ∶Priority 的简写,程序的优先执行顺序,越小越早被执行;
<li>NI ∶Nice 的简写,与 Priority 有关,也是越小越早被执行;
<li>%CPU∶CPU 的使用率;
<li>%MEM∶记忆体的使用率;
<li>TIME+∶CPU 使用时间的累加;</ul>
一般来说,如果鸟哥想要找出最损耗 CPU 资源的那个程序时,大多使用的就是 top
这支程式啦!然后强制以 CPU 使用资源来排序 (在 top 当中按下 P 即可),
就可以很快的知道啦! ^_^。多多爱用这个好用的东西喔!<br><br>
</div>
<a name=pstree><hr></a><li><span class=text_import1>pstree</span></li>
<div class=block2>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>pstree [-Aup]</span>
<span class=term_say>参数∶
-A ∶各程序树之间的连接以 ASCII 字元来连接;
-p ∶并同时列出每个 process 的 PID;
-u ∶并同时列出每个 process 的所属帐号名称。
范例∶</span>
<span class=term_hd>范例一∶列出目前系统上面所有的程序树的相关性∶</span>
[root@linux ~]# <span class=term_command>pstree -A</span>
init-+-atd
|-crond
|-dhclient
|-dovecot-+-dovecot-auth
| `-3*[pop3-login]
|-events/0
|-2*[gconfd-2]
|-master-+-pickup
| `-qmgr
|-6*[mingetty]
|-sshd---sshd---sshd---bash---su---bash---pstree
|-udevd
`-xinetd
<span class=term_say># 注意一下,为了节省版面,所以鸟哥已经删去很多程序了!
# 同时注意到 sshd--- 那一行,嘿嘿!有相关的程序都被列出在一起了!</span>
<span class=term_hd>范例二∶承上题,同时秀出 PID 与 users </span>
[root@linux ~]# <span class=term_command>pstree -Aup</span>
init(1)-+-atd(16143)
|-crond(1676)
|-dhclient(21339)
|-dovecot(1606)-+-dovecot-auth(1616)
| |-pop3-login(747,dovecot)
| |-pop3-login(10487,dovecot)
| `-pop3-login(10492,dovecot)
|-events/0(3)
|-gconfd-2(2352)
|-gconfd-2(32158)
|-master(1666)-+-pickup(10817,postfix)
| `-qmgr(1675,postfix)
|-mingetty(1792)
|-mingetty(21366)
|-sshd(5281)---sshd(10576)---sshd(10578,vbird)---bash(10579)
|-syslogd(1539)
|-udevd(801)
`-xinetd(1589)
<span class=term_say># 呵呵!在括号 () 内的即是 PID 以及该程序的 owner 喔!不过,由于我是使用
# root 的身份执行此一指令,所以棉,嘿嘿!属于root的可能就不会显示出来啦!</span>
</pre></td></tr></table>
如果要找程序之间的相关性,呵呵!这个 pstree 真是好用到不行!
直接输入 pstree 可以查到程序相关性,不过,有的时候由于语系的问题会出现乱码,
因此,建议直接使用 -A 用 ASCII 字元作为连结介面 (就是那个 +, -, |, ` 等等啦!)
会比较看的清楚点。另外,如果还想要知道 PID 与所属使用者,加上 -u 及 -p 两个参数即可。
我们前面不是一直提到,如果子程序挂点或者是老是砍不掉子程序时,
该如何找到父程序吗?呵呵!用这个 pstree 就对了! ^_^<br>
</div>
</div>
<hr><a name=process_2></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>程序的删除</span><br>
<div class=block2>
我们在前几个小节提到的『<a href="#background">背景工作管理</a>』当中提到过,
要给予某个已经存在的工作某些动作时,是直接给予一个讯号 (signal) 给该 PID 即可。
常见的工作可以使用 kill -l (L 的小写) 来查阅!而主要的讯号代号与名称对应及内容是∶<br><br>
<table width=95% border=1 cellspacing=0 cellpadding=3 bgcolor=lightyellow>
<tr bgcolor=lightblue align=center><td width=30>代号</td><td width=50>名称</td><td>内容</td></tr>
<tr><td align=center>1</td><td align=center>SIGHUP</td><td>代表『让该 PID 重新读取自己的设定档』
,类似重新启动</td></tr>
<tr><td align=center>2</td><td align=center>SIGINT</td><td>代表用键盘输入的 [ctrl]-c 来中断一个程序的进行。</td></tr>
<tr><td align=center>9</td><td align=center>SIGKILL</td><td>代表强制中断一个程序的进行,如
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -