在正式的工作環境中,作為Linux系統管理員,監視系統程式的執行情況應該是日常的工作之一。那麼,到底什麼是程式呢?
什麼是程式
程式是正在執行的一個程式或命令,每個程式都是一個執行的實體,都有自己的地址空間,並佔用一定的系統資源,它由程式指令,和從檔案、其它程式中讀取的資料或系統使用者的輸入組成。作業系統會給程式分配一個 ID,稱為 PID(程式 ID)。
程式的型別
- 前臺程式: 這些程式由終端會話初始化和控制。換句話說,需要有一個連線到系統中的使用者來啟動這樣的程式;它們不是作為系統功能/服務的一部分自動啟動
- 後臺程式: 這些程式沒有連線到終端;它們不需要任何使用者輸入
- 守護程式:這是後臺程式的特殊型別,它們在系統啟動時啟動,並作為服務一直執行
在作業系統中,所有可以執行的程式與命令都會產生程式。只是有些程式和命令非常簡單,如 ls 命令等,它們在執行完後就會結束,相應的程式也就會終結,所以我們很難捕捉到這些程式。但是還有一些程和命令,比如 httpd 程式,啟動之後就會一直駐留在系統當中,我們把這樣的程式稱作常駐記憶體程式
。
某些程式會產生一些新的程式,我們把這些程式稱作子程式,而把這個程式本身稱作父程式。比如,我們必須正常登入到 Shell 環境中才能執行系統命令,而 Linux 的標準 Shell 是 bash。我們在 bash 當中執行了 ls 命令,那麼 bash 就是父程式,而 ls 命令是在 bash 程式中產生的程式,所以 ls 程式是 bash 程式的子程式。也就是說,子程式是依賴父程式而產生的,如果父程式不存在,那麼子程式也不存在了。
檢視系統中所有的程式: ps aux
ps命令用於檢視系統中的程式狀態,格式為“ps [引數]”。
- 檢視系統中所有的程式
$ ps aux
引數 | 作用 |
---|---|
-a | 顯示所有程式(包括其他使用者的程式) |
-u | 使用者以及其他詳細資訊 |
-x | 顯示沒有控制終端的程式 |
如上圖,我們來看看以上輸出資訊中各列的具體含義:
列名 | 含義 |
---|---|
USER | 該程式是由哪個使用者產生的 |
PID | 程式的 ID |
%CPU | 該程式佔用 CPU 資源的百分比,佔用的百分比越高,程式越耗費資源 |
%MEM | 該程式佔用實體記憶體的百分比,佔用的百分比越高,程式越耗費資源 |
VSZ | 該程式佔用虛擬記憶體的大小,單位為 KB |
RSS | 該程式佔用實際實體記憶體的大小,單位為 KB |
TTY | 該程式是在哪個終端執行的。 |
STAT | 程式狀態。 |
START | 該程式的啟動時間。 |
TIME | 該程式佔用 CPU 的運算時間,注意不是系統時間。 |
COMMAND | 產生此程式的命令名。 |
常見的STAT程式狀態有以下幾種:
- D:不可被喚醒的睡眠狀態,通常用於 I/O 情況
- R:該程式正在執行
- S:該程式處於睡眠狀態,可被喚醒
- T:停止狀態,可能是在後臺暫停或程式處於除錯狀態
- W:記憶體互動狀態(從 2.6 核心開始無效)
- X:死掉的程式(應該不會出現)
- Z:殭屍程式。程式已經中止,但是部分程式還在記憶體當中
- <:高優先順序(以下狀態在 BSD 格式中出現)
- N:低優先順序
- L:被鎖入記憶體
- s:包含子程式
- l:多執行緒(小寫 L)
- +:位於後臺
檢視系統中所有的程式 ps -le
ps -le
可以檢視系統中所有的程式,而且還能看到程式的父程式的 PID 和程式優先順序。
引數 | 作用 |
---|---|
-l | 長格式顯示更加詳細的資訊; |
-e | 顯示所有程式; |
如上圖,我們來看看以上輸出資訊中各列的具體含義:
列名 | 含義 |
---|---|
F | 程式標誌,說明程式的許可權,常見的標誌有兩個:1 程式可以被複制,但是不能被執行;4:程式使用超級使用者許可權; |
S | 程式狀態。具體的狀態和ps aux 命令中的 STAT 狀態一致; |
UID | 執行此程式的使用者的 ID; |
PID | 程式的 ID; |
PPID | 父程式的 ID; |
C | 該程式的 CPU 使用率,單位是百分比; |
PRI | 程式的優先順序,數值越小,該程式的優先順序越高,越早被 CPU 執行; |
NI | 程式的優先順序,數值越小,該程式越早被執行; |
ADDR | 該程式在記憶體的哪個位置; |
SZ | 該程式佔用多大記憶體; |
WCHAN | 該程式是否執行。”-“代表正在執行; |
TTY | 該程式由哪個終端產生; |
TIME | 該程式佔用 CPU 的運算時間,注意不是系統時間; |
CMD | 產生此程式的命令名; |
刪除程式 kill
kill可將指定的資訊送至程式,預設的資訊為SIGTERM(15),可將指定程式終止。若仍無法終止該程式,可使用SIGKILL(9)資訊嘗試強制刪除程式。kill命令格式如下:
$ kill [訊號] PID
訊號編號 | 訊號名 | 含義 |
---|---|---|
0 | EXIT | 程式退出時收到該資訊。 |
1 | HUP | 掛掉電話線或終端連線的掛起訊號,這個訊號也會造成某些程式在沒有終止的情況下重新初始化。 |
2 | INT | 表示結束程式,但並不是強制性的,相當於用鍵盤輸入 [ctrl]-c 來中斷一個程式的進行 |
3 | QUIT | 退出 |
9 | KILL | 殺死程式,即強制結束程式 |
15 | TERM | 正常結束程式,命令的預設訊號 |
19 | SIGSTOP | 相當於用鍵盤輸入 [ctrl]-z 來暫停一個程式的進行 |
我們用的最多的訊號編號是1,9,15。
最後我們來看看所謂的“殭屍程式”,殭屍程式是當子程式比父程式先結束,而父程式又沒有回收子程式,釋放子程式佔用的資源,此時子程式將成為一個殭屍程式。殭屍程式會對主機的穩定性產生影響,所以,在產生殭屍程式後,一定要對產生殭屍程式的軟體進行最佳化,避免一直產生殭屍程式;對於已經產生的殭屍程式,可以在查詢出來之後強制中止。
本作品採用《CC 協議》,轉載必須註明作者和本文連結