Linux進程顯示與刪除
在Linux系統中,每個執行的任務都稱爲進程(Process),例如使用ls命令瀏覽目錄內容,或查詢日期時間輸入的date命令。同時,在每個進程啓動時,系統都會給它指定一個惟一的數值,這個數值就稱爲“進程ID”(Process ID,PID)。如果要針對某個進程進行管理,例如結束進程的執行,必須以進程ID(而不是該進程的名稱)作爲參考的對象。
每個進程都會存在一個對應的父進程(Parent Process),而由這個父進程可以複製多個子進程,這是網絡程序編寫時很常用的一種方式,這個動作就稱爲Fork,如圖12-1所示。
圖12-1 |
最常見的一個Fork例子就是Web服務器,Web服務器通常都可以支持多個客戶端的連接,而服務器方面利用一個父進程來接受客戶端的請求,然後利用Fork來產生一個子進程以處理後續的任務,之後該父進程就可再度回到等待客戶端請求的狀態,如此即可不斷地爲客戶端服務。
前臺與後臺進程
每個進程都可能以兩種方式存在:前臺(Foreground)與後臺(Background)。所謂前臺進程,就是用戶目前在屏幕上進行操作的進程;而後臺進程則是實際上在操作,但由屏幕上並無法看到的進程。
通常使用後臺方式執行的情況是,當此進程較爲複雜且必須執行較長的時間時,我們會將它置於後臺中執行,以避免佔用屏幕的時間過久,而無法執行其他的進程。
系統的服務一般都是以後臺進程的方式存在的,而且都會駐留在系統中,直到關機時才結束,這類服務我們也稱爲Daemon,在Linux系統中就包含許多Daemon。
判斷Daemon最簡單的方法就是由名稱來判斷,多數Daemon都是由服務名稱加上d來產生的,例如HTTP服務的Daemon爲httpd。
顯示目前進程
ps命令是Process Status的縮寫,它的功能是查看目前的系統中有哪些進程正在執行,以及它們的執行情況。您可以直接輸入ps命令名稱而不加任何參數。
如果直接執行ps命令,則會出現類似以下的信息:
[root@ns1 ~]# ps TTY TIME CMD 1635 pts/0 00:00:00 su 1636 pts/0 00:00:00 bash 1679 pts/0 00:00:00 ps |
上述ps命令顯示的數據共分爲4個字段,它們的說明如下:
PID:進程標識(Process ID),系統即是憑着這個編號來識別及處理此進程的。
TTY:Teletypewriter,登錄的終端機編號。
TIME:此進程所消耗的CPU時間。
CMD:正在執行的命令或進程名稱。
上述的信息是ps命令顯示的最基本數據畫面,其實ps支持非常多的參數。因爲ps是非常常用的命令,所以本書在此將說明其中較爲重要的參數的使用方法。
顯示詳細信息
如果需要更詳細的系統數據,可以使用-l(Long)參數,它除了顯示ps命令的4個基本字段數據外,另外還有10個額外數據可供查看,這些額外數據的內容及說明如下:
[root@ns1 ~]# ps -l F S UID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 9822 9521 0 81 0 - 1220 wait4 pts/2 00:00:00 su 4 S 0 9970 9822 0 75 0 - 1294 wait4 pts/2 00:00:00b ash 4 R 0 15354 9970 0 80 0 - 788 - pts/2 00:00:00 ps |
F:該進程狀態的標誌(Flag),表12-1是較常用的標誌及說明。
表12-1 進程狀態標誌說明
標 志 名 稱 標 志 代 碼 說 明
ALIGNWARN 001 打印警告信息
STARTING 002 進程正在初始化
EXITING 004 系統正在關機
PTRACED 010 表示已調用ptrace(0)
TRACESYS 020 跟蹤System Call
FORKNOEXEC 040 已執行fork但沒有執行exec
SUPERPRIV 100 以root身份執行
DUMPCORE 200 內核轉儲
SIGNALED 400 以Signal結束進程
?S:進程狀態代碼(Process State Codes),可用的代碼及說明如表12-2所示。
表12-2 進程狀態代碼說明
代 碼 說 明
D 不可中斷的閒置狀態(Uninterruptible Sleep)
R 可執行的
S 閒置狀態
(續)
代 碼 說 明
T 跟蹤或停止
Z 已死亡的進程(Zombie)
W 沒有足夠的內存頁可分配
< 高優先級的進程
N 低優先級的進程
L 有內存頁分配並鎖在內存內
UID:進程執行者的ID(User ID)。
PPID:父進程標識(Parent Process ID)。
PRI:進程執行的優先級(Priority)。
NI:nice,是指進程執行優先級的nice值,負值表示其優先級較高。
SZ:Size,進程所佔用的內存大小,以KB爲單位。
WCHAN:Waiting Channel,表示進程或系統調用等待時的地址。
而另一種顯示詳細內容信息的參數爲-u(User),它的主要功能是將進程數據以用戶的格式來顯示,以下是部分的示例內容以及新的字段說明:
[root@ns1 ~]# ps -u USER %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 9822 0.0 0.0 4880 168 pts/2 S 16:20 0:00 [su] root 9970 0.0 0.4 5176 872 pts/2 S 16:20 0:00 -bash root 15448 0.0 0.3 2644 696 pts/2 R 18:30 0:00 ps -u ...... ?%CPU:CPU使用率百分比。 ?%MEM:內存使用率百分比。 ?VSZ:佔用的虛擬內存大小。 ?RSS:佔用的物理內存大小。 ?START:進程開始時間。 |
顯示後臺進程
其實,系統中目前執行的進程絕不是隻有輸入ps命令時的數目,事實上有爲數更多的進程以後臺的方式來執行,它們一般都是系統的服務(Daemon),或是用戶利用&來處理的進程。如果要查看這些後臺進程,可以使用-x參數,以下是部分的示例內容:
[root@ns1 ~]# ps -x TTY STAT TIME COMMAND 1 ? S 0:04 init [5] 2 ? SW 0:00 [keventd] 3 ? SW 0:00 [kapmd] 4 ? SWN 0:00 [ksoftirqd/0] ...... |
有經驗的管理員一般都習慣一次查看所有用戶執行的進程以及後臺進程,此時可以使用-aux參數。
雖然-aux參數可以提供最詳盡的信息,但是有時並不是很容易找出所需的信息,因此我們可配合使用grep命令,以縮小查看的範圍。以下是找出與用戶jack有關的進程及其內容的示例:
[root@ns1 ~]# ps -aux | grep jack jack 2728 0.4 0.7 5164 1380 pts/0 S 08:18 0:00 -bash root 2806 0.0 0.3 4444 644 pts/0 S 08:18 0:00 grep jack |
....
結束執行中的進程
如果某個進程執行到一半時中斷,或消耗太多的系統資源,例如內存數量及CPU時間,此時您可以考慮使用kill命令來將指定的信號傳送到該進程。
雖然kill命令可以傳送的信號有很多種,但以SIGTERM(15)或SIGKILL(9)居多,它們都是用來結束進程執行的。您可以使用-l參數來查看所有可供傳送的信號,如圖12-2所示。
圖12-2 kill命令可傳送的信號 |
因爲kill命令在使用時必須通過進程ID來指定信號的接收進程,所以需先以ps命令來得知要傳送的PID,之後再使用kill命令加上指定的PID來送出終止信號以結束進程。
以下示例假設要終止PID 16525進程的執行:
[root@ns1 ~]# kill 16525
因爲有些進程會捕捉某些信號,所以當直接指定PID無法終止其進程時,您可以使用-9參數,它代表送出SIGKILL信號。
[root@ns1 ~]# kill -9 16525
如果使用-9參數仍無法結束該進程,還可以嘗試使用-15參數來送出SIGTERM信號;如果連-15參數都無法成功地刪除此進程,則只有重新啓動這一方法了。
通常,極難刪除的進程大多與系統運行有關聯,如果刪除後可能會影響系統的性能或執行,因此最好不要養成直接使用-9和-15參數的習慣。
[root@ns1 ~]# kill -15 16525
kill命令另外一個常用的時機是,當對某個Daemon進行修改或設置後,您可以使用-HUP(Hang Up)參數來重新啓動該進程,這可減少重新啓動計算機的時間。
[root@ns1 ~]# kill -HUP 16525