在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Linux/ 進(jìn)程
網(wǎng)絡(luò)系統(tǒng)
打印
重定向
使用命令
位置參數(shù)
權(quán)限
文本處理
疑難排解
layout: book-zh title: 自定制 shell 提示符
查找文件
layout: book-zh title: vi 簡(jiǎn)介
shell 環(huán)境
什么是 shell
編譯程序
鍵盤(pán)高級(jí)操作技巧
流程控制:case 分支
流程控制:if 分支結(jié)構(gòu)
layout: book-zh title: 軟件包管理
進(jìn)程
存儲(chǔ)媒介
格式化輸出
編寫(xiě)第一個(gè) Shell 腳本
啟動(dòng)一個(gè)項(xiàng)目
流程控制:while/until 循環(huán)
文件系統(tǒng)中跳轉(zhuǎn)
字符串和數(shù)字
讀取鍵盤(pán)輸入
歸檔和備份
探究操作系統(tǒng)
流程控制:for 循環(huán)
自頂向下設(shè)計(jì)
數(shù)組
操作文件和目錄
奇珍異寶
從 shell 眼中看世界
正則表達(dá)式

進(jìn)程

通常,現(xiàn)在的操作系統(tǒng)都支持多任務(wù),意味著操作系統(tǒng)(給用戶)造成了一種假象,(讓用戶覺(jué)得) 它同時(shí)能夠做多件事情,事實(shí)上,它是快速地輪換執(zhí)行這些任務(wù)的。Linux 內(nèi)核通過(guò)使用進(jìn)程,來(lái) 管理多任務(wù)。通過(guò)進(jìn)程,Linux 安排不同的程序等待使用 CPU。

有時(shí)候,計(jì)算機(jī)變得呆滯,運(yùn)行緩慢,或者一個(gè)應(yīng)用程序停止響應(yīng)。在這一章中,我們將看一些 可用的命令行工具,這些工具幫助我們查看程序的執(zhí)行狀態(tài),以及怎樣終止行為不當(dāng)?shù)倪M(jìn)程。

這一章將介紹以下命令:

  • ps – 報(bào)告當(dāng)前進(jìn)程快照

  • top – 顯示任務(wù)

  • jobs – 列出活躍的任務(wù)

  • bg – 把一個(gè)任務(wù)放到后臺(tái)執(zhí)行

  • fg – 把一個(gè)任務(wù)放到前臺(tái)執(zhí)行

  • kill – 給一個(gè)進(jìn)程發(fā)送信號(hào)

  • killall – 殺死指定名字的進(jìn)程

  • shutdown – 關(guān)機(jī)或重啟系統(tǒng)

進(jìn)程是怎樣工作的

當(dāng)系統(tǒng)啟動(dòng)的時(shí)候,內(nèi)核先把一些它自己的程序初始化為進(jìn)程,然后運(yùn)行一個(gè)叫做 init 的程序。init, 依次地,再運(yùn)行一系列的稱(chēng)為 init 腳本的 shell 腳本(位于/etc),它們可以啟動(dòng)所有的系統(tǒng)服務(wù)。 其中許多系統(tǒng)服務(wù)以守護(hù)(daemon)程序的形式實(shí)現(xiàn),守護(hù)程序僅在后臺(tái)運(yùn)行,沒(méi)有任何用戶接口。 這樣,即使我們沒(méi)有登錄系統(tǒng),至少系統(tǒng)也在忙于執(zhí)行一些例行事務(wù)。

一個(gè)程序可以發(fā)動(dòng)另一個(gè)程序,這個(gè)事實(shí)在進(jìn)程方案中,表述為一個(gè)父進(jìn)程創(chuàng)建了一個(gè)子進(jìn)程。

內(nèi)核維護(hù)每個(gè)進(jìn)程的信息,以此來(lái)保持事情有序。例如,系統(tǒng)分配給每個(gè)進(jìn)程一個(gè)數(shù)字,這個(gè)數(shù)字叫做 進(jìn)程 ID 或 PID。PID 號(hào)按升序分配,init 進(jìn)程的 PID 總是1。內(nèi)核也對(duì)分配給每個(gè)進(jìn)程的內(nèi)存進(jìn)行跟蹤。 像文件一樣,進(jìn)程也有所有者和用戶 ID,有效用戶 ID,等等。

查看進(jìn)程

查看進(jìn)程,最常使用地命令(有幾個(gè)命令)是 ps。ps 程序有許多選項(xiàng),它最簡(jiǎn)單地使用形式是這樣的:

[me@linuxbox ~]$ ps
PID TTY           TIME CMD
5198 pts/1    00:00:00 bash
10129 pts/1   00:00:00 ps

上例中,列出了兩個(gè)進(jìn)程,進(jìn)程 5198 和進(jìn)程 10129,各自代表命令 bash 和 ps。正如我們所看到的, 默認(rèn)情況下,ps 不會(huì)顯示很多進(jìn)程信息,只是列出與當(dāng)前終端會(huì)話相關(guān)的進(jìn)程。為了得到更多信息, 我們需要加上一些選項(xiàng),但是在這樣做之前,我們先看一下 ps 命令運(yùn)行結(jié)果的其它字段。 TTY 是 "Teletype" 的簡(jiǎn)寫(xiě),是指進(jìn)程的控制終端。這里,Unix 展示它的年齡。TIME 字段表示 進(jìn)程所消耗的 CPU 時(shí)間數(shù)量。正如我們所看到的,這兩個(gè)進(jìn)程使計(jì)算機(jī)工作起來(lái)很輕松。

如果給 ps 命令加上選項(xiàng),我們可以得到更多關(guān)于系統(tǒng)運(yùn)行狀態(tài)的信息:

[me@linuxbox ~]$ ps x
PID TTY   STAT   TIME COMMAND
2799 ?    Ssl    0:00 /usr/libexec/bonobo-activation-server –ac
2820 ?    Sl     0:01 /usr/libexec/evolution-data-server-1.10 --

and many more...

加上 "x" 選項(xiàng)(注意沒(méi)有開(kāi)頭的 "-" 字符),告訴 ps 命令,展示所有進(jìn)程,不管它們由什么 終端(如果有的話)控制。在 TTY 一欄中出現(xiàn)的 "?" ,表示沒(méi)有控制終端。使用這個(gè) "x" 選項(xiàng),可以 看到我們所擁有的每個(gè)進(jìn)程的信息。

因?yàn)橄到y(tǒng)中正運(yùn)行著許多進(jìn)程,所以 ps 命令的輸出結(jié)果很長(zhǎng)。這經(jīng)常很有幫助,要是把 ps 的輸出結(jié)果 管道到 less 命令,借助 less 工具,更容易瀏覽。一些選項(xiàng)組合也會(huì)產(chǎn)生很長(zhǎng)的輸出結(jié)果,所以最大化 終端仿真器窗口,也是一個(gè)好主意。

輸出結(jié)果中,新添加了一欄,標(biāo)題為 STAT 。STAT 是 "state" 的簡(jiǎn)寫(xiě),它揭示了進(jìn)程當(dāng)前狀態(tài):

表11-1: 進(jìn)程狀態(tài)
狀態(tài) 意義
R 運(yùn)行。這意味著,進(jìn)程正在運(yùn)行或準(zhǔn)備運(yùn)行。
S 正在睡眠。 進(jìn)程沒(méi)有運(yùn)行,而是,正在等待一個(gè)事件, 比如說(shuō),一個(gè)按鍵或者網(wǎng)絡(luò)數(shù)據(jù)包。
D 不可中斷睡眠。進(jìn)程正在等待 I/O,比方說(shuō),一個(gè)磁盤(pán)驅(qū)動(dòng)器的 I/O。
T 已停止. 已經(jīng)指示進(jìn)程停止運(yùn)行。稍后介紹更多。
Z 一個(gè)死進(jìn)程或“僵尸”進(jìn)程。這是一個(gè)已經(jīng)終止的子進(jìn)程,但是它的父進(jìn)程還沒(méi)有清空它。 (父進(jìn)程沒(méi)有把子進(jìn)程從進(jìn)程表中刪除)
一個(gè)高優(yōu)先級(jí)進(jìn)程。這可能會(huì)授予一個(gè)進(jìn)程更多重要的資源,給它更多的 CPU 時(shí)間。 進(jìn)程的這種屬性叫做 niceness。具有高優(yōu)先級(jí)的進(jìn)程據(jù)說(shuō)是不好的(less nice), 因?yàn)樗加昧吮容^多的 CPU 時(shí)間,這樣就給其它進(jìn)程留下很少時(shí)間。
N 低優(yōu)先級(jí)進(jìn)程。 一個(gè)低優(yōu)先級(jí)進(jìn)程(一個(gè)“好”進(jìn)程)只有當(dāng)其它高優(yōu)先級(jí)進(jìn)程執(zhí)行之后,才會(huì)得到處理器時(shí)間。

進(jìn)程狀態(tài)信息之后,可能還跟隨其他的字符。這表示各種外來(lái)進(jìn)程的特性。詳細(xì)信息請(qǐng)看 ps 手冊(cè)頁(yè)。

另一個(gè)流行的選項(xiàng)組合是 "aux"(不帶開(kāi)頭的"-"字符)。這會(huì)給我們更多信息:

[me@linuxbox ~]$ ps aux
USER   PID  %CPU  %MEM     VSZ    RSS  TTY   STAT   START   TIME  COMMAND
root     1   0.0   0.0    2136    644  ?     Ss     Mar05   0:31  init
root     2   0.0   0.0       0      0  ?     S<     Mar05   0:00  [kt]

and many more...

這個(gè)選項(xiàng)組合,能夠顯示屬于每個(gè)用戶的進(jìn)程信息。使用這個(gè)選項(xiàng),可以喚醒 “BSD 風(fēng)格” 的輸出結(jié)果。 Linux 版本的 ps 命令,可以模擬幾個(gè)不同 Unix 版本中的 ps 程序的行為。通過(guò)這些選項(xiàng),我們得到 這些額外的列。

表11-2: BSD 風(fēng)格的 ps 命令列標(biāo)題
標(biāo)題 意思
USER 用戶 ID. 進(jìn)程的所有者。
%CPU 以百分比表示的 CPU 使用率
%MEM 以百分比表示的內(nèi)存使用率
VSZ 虛擬內(nèi)存大小
RSS 進(jìn)程占用的物理內(nèi)存的大小,以千字節(jié)為單位。
START 進(jìn)程運(yùn)行的起始時(shí)間。若超過(guò)24小時(shí),則用天表示。

用 top 命令動(dòng)態(tài)查看進(jìn)程

雖然 ps 命令能夠展示許多計(jì)算機(jī)運(yùn)行狀態(tài)的信息,但是它只是提供,ps 命令執(zhí)行時(shí)刻的機(jī)器狀態(tài)快照。 為了看到更多動(dòng)態(tài)的信息,我們使用 top 命令:

[me@linuxbox ~]$ top

top 程序連續(xù)顯示系統(tǒng)進(jìn)程更新的信息(默認(rèn)情況下,每三分鐘更新一次),"top"這個(gè)名字 來(lái)源于這個(gè)事實(shí),top 程序是用來(lái)查看系統(tǒng)中“頂端”進(jìn)程的。top 顯示結(jié)果由兩部分組成: 最上面是系統(tǒng)概要,下面是進(jìn)程列表,以 CPU 的使用率排序。

top - 14:59:20 up 6:30, 2 users, load average: 0.07, 0.02, 0.00
Tasks: 109 total,   1 running,  106 sleeping,    0 stopped,    2 zombie
Cpu(s): 0.7%us, 1.0%sy, 0.0%ni, 98.3%id, 0.0%wa, 0.0%hi, 0.0%si
Mem:   319496k total,   314860k used,   4636k free,   19392k buff
Swap:  875500k total,   149128k used,   726372k free,  114676k cach

 PID  USER       PR   NI   VIRT   RES   SHR  S %CPU  %MEM   TIME+    COMMAND
6244  me         39   19  31752  3124  2188  S  6.3   1.0   16:24.42 trackerd
....

其中系統(tǒng)概要包含許多有用信息。下表是對(duì)系統(tǒng)概要的說(shuō)明:

表11-3: top 命令信息字段
行號(hào) 字段 意義
1 top 程序名。
14:59:20 當(dāng)前時(shí)間。
up 6:30 這是正常運(yùn)行時(shí)間。它是計(jì)算機(jī)從上次啟動(dòng)到現(xiàn)在所運(yùn)行的時(shí)間。 在這個(gè)例子里,系統(tǒng)已經(jīng)運(yùn)行了六個(gè)半小時(shí)。
2 users 有兩個(gè)用戶登錄系統(tǒng)。
load average: 加載平均值是指,等待運(yùn)行的進(jìn)程數(shù)目,也就是說(shuō),處于運(yùn)行狀態(tài)的進(jìn)程個(gè)數(shù), 這些進(jìn)程共享 CPU。展示了三個(gè)數(shù)值,每個(gè)數(shù)值對(duì)應(yīng)不同的時(shí)間周期。第一個(gè)是最后60秒的平均值, 下一個(gè)是前5分鐘的平均值,最后一個(gè)是前15分鐘的平均值。若平均值低于1.0,則指示計(jì)算機(jī) 工作不忙碌。
2 Tasks: 總結(jié)了進(jìn)程數(shù)目和各種進(jìn)程狀態(tài)。
3 Cpu(s): 這一行描述了 CPU 正在執(zhí)行的進(jìn)程的特性。
0.7%us 0.7% of the CPU is being used for user processes. 這意味著進(jìn)程在內(nèi)核之外。
1.0%sy 1.0%的 CPU 時(shí)間被用于系統(tǒng)(內(nèi)核)進(jìn)程。
0.0%ni 0.0%的 CPU 時(shí)間被用于"nice"(低優(yōu)先級(jí))進(jìn)程。
98.3%id 98.3%的 CPU 時(shí)間是空閑的。
0.0%wa 0.0%的 CPU 時(shí)間來(lái)等待 I/O。
4 Mem: 展示物理內(nèi)存的使用情況。
5 Swap: 展示交換分區(qū)(虛擬內(nèi)存)的使用情況。

top 程序接受一系列從鍵盤(pán)輸入的命令。兩個(gè)最有趣的命令是 h 和 q。h,顯示程序的幫助屏幕,q, 退出 top 程序。

兩個(gè)主要的桌面環(huán)境都提供了圖形化應(yīng)用程序,來(lái)顯示與 top 程序相似的信息 (和 Windows 中的任務(wù)管理器差別不多),但是我覺(jué)得 top 程序要好于圖形化的版本, 因?yàn)樗\(yùn)行速度快,并且消費(fèi)很少的系統(tǒng)資源。畢竟,我們的系統(tǒng)監(jiān)測(cè)程序不能成為 系統(tǒng)怠工的源泉,而這是我們?cè)噲D追蹤的信息。

控制進(jìn)程

現(xiàn)在我們可以看到和監(jiān)測(cè)進(jìn)程,然后得到一些對(duì)它們的控制權(quán)。為了我們的實(shí)驗(yàn),我們將使用 一個(gè)叫做 xlogo 的小程序,作為我們的實(shí)驗(yàn)品。這個(gè) xlogo 程序是 X 窗口系統(tǒng) (底層引擎使圖形界面顯示在屏幕上)提供的實(shí)例程序,這個(gè)實(shí)例簡(jiǎn)單地顯示一個(gè)大小可調(diào)的 包含 X 標(biāo)志的窗口。首先,我們需要知道測(cè)試的主題:

[me@linuxbox ~]$ xlogo

命令執(zhí)行之后,一個(gè)包含 X 標(biāo)志的小窗口應(yīng)該出現(xiàn)在屏幕的某個(gè)位置上。在一些系統(tǒng)中,xlogo 命令 會(huì)打印一條警告信息,但是不用理會(huì)它。

小貼士:如果你的系統(tǒng)不包含 xlogo 程序,試著用 gedit 或者 kwrite 來(lái)代替。

通過(guò)調(diào)整它的窗口大小,我們能夠證明 xlogo 程序正在運(yùn)行。如果這個(gè)標(biāo)志以新的尺寸被重畫(huà), 則這個(gè)程序正在運(yùn)行。

注意,為什么我們的 shell 提示符還沒(méi)有返回?這是因?yàn)?shell 正在等待這個(gè)程序結(jié)束, 就像到目前為止我們用過(guò)的其它所有程序一樣。如果我們關(guān)閉 xlogo 窗口,shell 提示符就返回了。

中斷一個(gè)進(jìn)程

我們?cè)龠\(yùn)行 xlogo 程序一次,觀察一下發(fā)生了什么事。首先,執(zhí)行 xlogo 命令,并且 證實(shí)這個(gè)程序正在運(yùn)行。下一步,回到終端窗口,按下 Ctrl-c。

[me@linuxbox ~]$ xlogo
[me@linuxbox ~]$

在一個(gè)終端中,輸入 Ctrl-c,中斷一個(gè)程序。這意味著,我們禮貌地要求終止這個(gè)程序。 輸入 Ctrl-c 之后,xlogo 窗口關(guān)閉,shell 提示符返回。

通過(guò)這個(gè)技巧,許多(但不是全部)命令行程序可以被中斷。

把一個(gè)進(jìn)程放置到后臺(tái)(執(zhí)行)

比方說(shuō),我們想讓 shell 提示符返回,卻沒(méi)有終止 xlogo 程序。為達(dá)到這個(gè)目的,我們把 這個(gè)程序放到后臺(tái)執(zhí)行。把終端看作是一個(gè)有前臺(tái)(表層放置可見(jiàn)的事物,像 shell 提示符) 和后臺(tái)(表層之下放置隱藏的事物)(的設(shè)備)。啟動(dòng)一個(gè)程序,讓它立即在后臺(tái) 運(yùn)行,我們?cè)诔绦蛎钪?,加?quot;&"字符:

[me@linuxbox ~]$ xlogo &
[1] 28236
[me@linuxbox ~]$

執(zhí)行命令之后,這個(gè) xlogo 窗口出現(xiàn),并且 shell 提示符返回,同時(shí)打印一些有趣的數(shù)字。 這條信息是 shell 特性的一部分,叫做工作控制。通過(guò)這條信息,shell 告訴我們,已經(jīng)啟動(dòng)了 工作號(hào)為1(“[1]”),PID 為28236的程序。如果我們運(yùn)行 ps 命令,可以看到我們的進(jìn)程:

[me@linuxbox ~]$ ps
  PID TTY         TIME   CMD
10603 pts/1   00:00:00   bash
28236 pts/1   00:00:00   xlogo
28239 pts/1   00:00:00   ps

工作控制,這個(gè) shell 功能可以列出從終端中啟動(dòng)的任務(wù)。執(zhí)行 jobs 命令,我們可以看到這個(gè)輸出列表:

[me@linuxbox ~]$ jobs
[1]+ Running            xlogo &

結(jié)果顯示我們有一個(gè)任務(wù),編號(hào)為“1”,它正在運(yùn)行,并且這個(gè)任務(wù)的命令是 xlogo &。

進(jìn)程返回到前臺(tái)

一個(gè)在后臺(tái)運(yùn)行的進(jìn)程對(duì)一切來(lái)自鍵盤(pán)的輸入都免疫,也不能用 Ctrl-c 來(lái)中斷它。使用 fg 命令,讓一個(gè)進(jìn)程返回前臺(tái)執(zhí)行:

[me@linuxbox ~]$ jobs
[1]+ Running        xlogo &
[me@linuxbox ~]$ fg %1
xlogo

fg 命令之后,跟隨著一個(gè)百分號(hào)和工作序號(hào)(叫做 jobspec)。如果我們只有一個(gè)后臺(tái)任務(wù),那么 jobspec 是可有可無(wú)的。輸入 Ctrl-c 來(lái)終止 xlogo 程序。

停止一個(gè)進(jìn)程

有時(shí)候,我們想要停止一個(gè)進(jìn)程,而沒(méi)有終止它。這樣會(huì)把一個(gè)前臺(tái)進(jìn)程移到后臺(tái)等待。 輸入 Ctrl-z,可以停止一個(gè)前臺(tái)進(jìn)程。讓我們?cè)囈幌隆T诿钐崾痉?,?zhí)行 xlogo 命令, 然后輸入 Ctrl-z:

[me@linuxbox ~]$ xlogo
[1]+ Stopped                 xlogo
[me@linuxbox ~]$

停止 xlogo 程序之后,通過(guò)調(diào)整 xlogo 的窗口大小,我們可以證實(shí)這個(gè)程序已經(jīng)停止了。 它看起來(lái)像死掉了一樣。使用 fg 命令,可以恢復(fù)程序到前臺(tái)運(yùn)行,或者用 bg 命令把程序移到后臺(tái)。

[me@linuxbox ~]$ bg %1
[1]+ xlogo &
[me@linuxbox ~]$

和 fg 命令一樣,如果只有一個(gè)任務(wù)的話,jobspec 參數(shù)是可選的。

因?yàn)榘岩粋€(gè)進(jìn)程從前臺(tái)移到后臺(tái)很方便,如果我們從命令行啟動(dòng)一個(gè)圖形界面的程序,但是 忘記把它放到后臺(tái)執(zhí)行,即沒(méi)有在命令后加上字符"&",(也不用擔(dān)心)。

為什么要從命令行啟動(dòng)一個(gè)圖形界面程序呢?有兩個(gè)原因。第一個(gè),你想要啟動(dòng)的程序,可能 沒(méi)有在窗口管理器的菜單中列出來(lái)(比方說(shuō) xlogo)。第二個(gè),從命令行啟動(dòng)一個(gè)程序, 你能夠看到一些錯(cuò)誤信息,如果從窗口系統(tǒng)中運(yùn)行程序的話,這些信息是不可見(jiàn)的。有時(shí)候, 一個(gè)程序不能從圖形界面菜單中啟動(dòng)。這時(shí)候,應(yīng)該從命令行中啟動(dòng)它。我們可能會(huì)看到 錯(cuò)誤信息,這些信息揭示了問(wèn)題所在。一些圖形界面程序還有許多有意思并且有用的命令行選項(xiàng)。

Signals

kill 命令被用來(lái)“殺死”程序。這樣我們就可以終止需要?dú)⑺赖某绦?。這里有一個(gè)實(shí)例:

[me@linuxbox ~]$ xlogo &
[1] 28401
[me@linuxbox ~]$ kill 28401
[1]+ Terminated               xlogo

首先,我們?cè)诤笈_(tái)啟動(dòng) xlogo 程序。shell 打印出 jobspec 和這個(gè)后臺(tái)進(jìn)程的 PID。下一步,我們使用 kill 命令,并且指定我們想要終止的進(jìn)程 PID。也可以用 jobspec(例如,“%1”)來(lái)代替 PID。

雖然這個(gè)命令很直接了當(dāng),但不僅僅這些。這個(gè) kill 命令不是確切地“殺死”程序,而是給程序 發(fā)送信號(hào)。信號(hào)是操作系統(tǒng)與程序之間進(jìn)行通信,所采用的幾種方式中的一種。我們已經(jīng)看到 信號(hào),在使用 Ctrl-c 和 Ctrl-z 的過(guò)程中。當(dāng)終端接受了其中一個(gè)按鍵組合后,它會(huì)給在前端運(yùn)行 的程序發(fā)送一個(gè)信號(hào)。在使用 Ctrl-c 的情況下,會(huì)發(fā)送一個(gè)叫做 INT(中斷)的信號(hào);當(dāng)使用 Ctrl-z 時(shí),則發(fā)送一個(gè)叫做 TSTP(終端停止)的信號(hào)。程序,反過(guò)來(lái),傾聽(tīng)信號(hào)的到來(lái),當(dāng)程序 接到信號(hào)之后,則做出響應(yīng)。一個(gè)程序能夠傾聽(tīng)和響應(yīng)信號(hào),這個(gè)事實(shí)允許一個(gè)程序做些事情, 比如,當(dāng)程序接到一個(gè)終止信號(hào)時(shí),它可以保存所做的工作。

通過(guò) kill 命令給進(jìn)程發(fā)送信號(hào)

kill 命令被用來(lái)給程序發(fā)送信號(hào)。它最常見(jiàn)的語(yǔ)法形式看起來(lái)像這樣:

kill [-signal] PID...

如果在命令行中沒(méi)有指定信號(hào),那么默認(rèn)情況下,發(fā)送 TERM(終止)信號(hào)。kill 命令被經(jīng)常 用來(lái)發(fā)送以下命令:

表 11-4: 常用信號(hào)
編號(hào) 名字 含義
1 HUP 掛起。這是美好往昔的痕跡,那時(shí)候終端機(jī)通過(guò)電話線和調(diào)制解調(diào)器連接到 遠(yuǎn)端的計(jì)算機(jī)。這個(gè)信號(hào)被用來(lái)告訴程序,控制的終端機(jī)已經(jīng)“掛起”。 通過(guò)關(guān)閉一個(gè)終端會(huì)話,可以說(shuō)明這個(gè)信號(hào)的作用。發(fā)送這個(gè)信號(hào)到終端機(jī)上的前臺(tái)程序,程序會(huì)終止。

許多守護(hù)進(jìn)程也使用這個(gè)信號(hào),來(lái)重新初始化。這意味著,當(dāng)發(fā)送這個(gè)信號(hào)到一個(gè)守護(hù)進(jìn)程后, 這個(gè)進(jìn)程會(huì)重新啟動(dòng),并且重新讀取它的配置文件。Apache 網(wǎng)絡(luò)服務(wù)器守護(hù)進(jìn)程就是一個(gè)例子。

2 INT 中斷。實(shí)現(xiàn)和 Ctrl-c 一樣的功能,由終端發(fā)送。通常,它會(huì)終止一個(gè)程序。
9 KILL 殺死。這個(gè)信號(hào)很特別。鑒于進(jìn)程可能會(huì)選擇不同的方式,來(lái)處理發(fā)送給它的 信號(hào),其中也包含忽略信號(hào),這樣呢,從不發(fā)送 Kill 信號(hào)到目標(biāo)進(jìn)程。而是內(nèi)核立即終止 這個(gè)進(jìn)程。當(dāng)一個(gè)進(jìn)程以這種方式終止的時(shí)候,它沒(méi)有機(jī)會(huì)去做些“清理”工作,或者是保存勞動(dòng)成果。 因?yàn)檫@個(gè)原因,把 KILL 信號(hào)看作殺手锏,當(dāng)其它終止信號(hào)失敗后,再使用它。
15 TERM 終止。這是 kill 命令發(fā)送的默認(rèn)信號(hào)。如果程序仍然“活著”,可以接受信號(hào),那么 這個(gè)信號(hào)終止。
18 CONT 繼續(xù)。在停止一段時(shí)間后,進(jìn)程恢復(fù)運(yùn)行。
19 STOP 停止。這個(gè)信號(hào)導(dǎo)致進(jìn)程停止運(yùn)行,而沒(méi)有終止。像 KILL 信號(hào),它不被 發(fā)送到目標(biāo)進(jìn)程,因此它不能被忽略。

讓我們實(shí)驗(yàn)一下 kill 命令:

[me@linuxbox ~]$ xlogo &
[1] 13546
[me@linuxbox ~]$ kill -1 13546
[1]+ Hangup         xlogo

在這個(gè)例子里,我們?cè)诤笈_(tái)啟動(dòng) xlogo 程序,然后通過(guò) kill 命令,發(fā)送給它一個(gè) HUP 信號(hào)。 這個(gè) xlogo 程序終止運(yùn)行,并且 shell 指示這個(gè)后臺(tái)進(jìn)程已經(jīng)接受了一個(gè)掛起信號(hào)。在看到這條 信息之前,你可能需要多按幾次 enter 鍵。注意,既可以用號(hào)碼,也可以用名字,不過(guò)要在名字前面 加上字母“SIG”,來(lái)指定所要發(fā)送的信號(hào)。

[me@linuxbox ~]$ xlogo &
[1] 13546
[me@linuxbox ~]$ kill -1 13546
[1]+ Hangup                    xlogo

重復(fù)上面的例子,試著使用其它的信號(hào)。記住,你也可以用 jobspecs 來(lái)代替 PID。

進(jìn)程,和文件一樣,擁有所有者,所以為了能夠通過(guò) kill 命令來(lái)給進(jìn)程發(fā)送信號(hào), 你必須是進(jìn)程的所有者(或者是超級(jí)用戶)。

除了上表列出的 kill 命令最常使用的信號(hào)之外,還有一些系統(tǒng)頻繁使用的信號(hào)。以下是其它一些常用 信號(hào)列表:

表 11-5: 其它常用信號(hào)
編號(hào) 名字 含義
3 QUIT 退出
11 SEGV 段錯(cuò)誤。如果一個(gè)程序非法使用內(nèi)存,就會(huì)發(fā)送這個(gè)信號(hào)。也就是說(shuō), 程序試圖寫(xiě)入內(nèi)存,而這個(gè)內(nèi)存空間是不允許此程序?qū)懭氲摹?/td>
20 TSTP 終端停止。當(dāng)按下 Ctrl-z 組合鍵后,終端發(fā)送這個(gè)信號(hào)。不像 STOP 信號(hào), TSTP 信號(hào)由目標(biāo)進(jìn)程接收,且可能被忽略。
28 WINCH 改變窗口大小。當(dāng)改變窗口大小時(shí),系統(tǒng)會(huì)發(fā)送這個(gè)信號(hào)。 一些程序,像 top 和 less 程序會(huì)響應(yīng)這個(gè)信號(hào),按照新窗口的尺寸,刷新顯示的內(nèi)容。

為了滿足讀者的好奇心,通過(guò)下面的命令可以得到一個(gè)完整的信號(hào)列表:

[me@linuxbox ~]$ kill -l

通過(guò) killall 命令給多個(gè)進(jìn)程發(fā)送信號(hào)

也有可能通過(guò) killall 命令,給匹配特定程序或用戶名的多個(gè)進(jìn)程發(fā)送信號(hào)。下面是 killall 命令的語(yǔ)法形式:

killall [-u user] [-signal] name...

為了說(shuō)明情況,我們將啟動(dòng)一對(duì) xlogo 程序的實(shí)例,然后再終止它們:

[me@linuxbox ~]$ xlogo &
[1] 18801
[me@linuxbox ~]$ xlogo &
[2] 18802
[me@linuxbox ~]$ killall xlogo
[1]- Terminated                xlogo
[2]+ Terminated                xlogo

記住,和 kill 命令一樣,你必須擁有超級(jí)用戶權(quán)限才能給不屬于你的進(jìn)程發(fā)送信號(hào)。

更多和進(jìn)程相關(guān)的命令

因?yàn)楸O(jiān)測(cè)進(jìn)程是一個(gè)很重要的系統(tǒng)管理任務(wù),所以有許多命令與它相關(guān)。玩玩下面幾個(gè)命令:

表11-6: 其它與進(jìn)程相關(guān)的命令
命令名 命令描述
pstree 輸出一個(gè)樹(shù)型結(jié)構(gòu)的進(jìn)程列表,這個(gè)列表展示了進(jìn)程間父/子關(guān)系。
vmstat 輸出一個(gè)系統(tǒng)資源使用快照,包括內(nèi)存,交換分區(qū)和磁盤(pán) I/O。 為了看到連續(xù)的顯示結(jié)果,則在命令名后加上延時(shí)的時(shí)間(以秒為單位)。例如,“vmstat 5”。 終止輸出,按下 Ctrl-c 組合鍵。
xload 一個(gè)圖形界面程序,可以畫(huà)出系統(tǒng)負(fù)載的圖形。
tload 與 xload 程序相似,但是在終端中畫(huà)出圖形。使用 Ctrl-c,來(lái)終止輸出。