⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 0440processcontrol.htm

📁 鸟哥的linux私房菜
💻 HTM
📖 第 1 页 / 共 5 页
字号:
  -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&lt;   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 + -