Linux 程序管理 ps、top、pstree命令
概述
作業系統中,所有可以執行的程式與命令都會產生程序。 如 ls 命令、touch 命令等,它們在執行完後就會結束,相應的程序也就會終結,所以我們很難捕捉到這些程序。但是還有一些程和命令,比如 httpd 程序,啟動之後就會一直駐留在系統當中,我們把這樣的程序稱作常駐記憶體程序。
某些程序會產生一些新的程序,我們把這些程序稱作子程序,而把這個程序本身稱作父程序。比如,我們必須正常登入到 Shell 環境中才能執行系統命令,而 Linux 的標準 Shell 是 bash。我們在 bash 當中執行了ls命令,那麼 bash 就是父程序,而 ls 命令是在 bash 程序中產生的程序,所以 ls 程序是 bash 程序的子程序。也就是說,子程序是依賴父程序而產生的,如果父程序不存在,那麼子程序也不存在了。
殭屍程序:殭屍程序的產生一般是由於程序非正常停止或程式編寫錯誤,導致子程序先於父程序結束,而父程序又沒有正確地回收子程序,從而造成子程序一直存在於記憶體當中,這就是殭屍程序。殭屍程序會對主機的穩定性產生影響,所以,在產生殭屍程序後,一定要對產生殭屍程序的軟體進行優化,避免一直產生殭屍程序;對於已經產生的殭屍程序,可以在查找出來之後強制中止。
ps命令:檢視系統中正在執行的程序
ps 是用來靜態地檢視系統中正在執行的程序的命令。不過這個命令有些特殊,它的部分選項不能加入"-",比如命令"ps aux",其中"aux"是選項,但是這個選項不能加入"-"。這是因為 ps 命令的部分選項需要遵守 BSD 作業系統的格式。所以,ps 命令的常用選項的組合是固定的。ps 命令格式如下:
檢視系統中所有的程序,使用BS作業系統格式
[[email protected] ~]# ps aux
檢視系統中所有的程序,使用Linux標準命令格式
[[email protected] ~]# ps -le
選項:
- a:顯示一個終端的所有程序,除會話引線外;
- u:顯示程序的歸屬使用者及記憶體的使用情況;
- x:顯示沒有控制終端的程序;
- -l:長格式顯示。顯示更加詳細的資訊;
- -e:顯示所有程序;
大家如果執行"man ps"命令,則會發現 ps 命令的幫助為了適應不同的類 UNIX 系統,可用格式非常多,不方便記憶。所以,我建議大家記憶幾個固定選項即可。比如:
- "ps aux"可以檢視系統中所有的程序;
- "ps -le"可以檢視系統中所有的程序,而且還能看到程序的父程序的PID和程序優先順序;
- "ps -l"只能看到當前Shell產生的程序;
ps aux 檢視系統中所有的程序
[[email protected] ~]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.3 126696 7196 ? Ss 15:40 0:05 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 root 12253 0.0 0.0 139492 1632 pts/1 R+ 21:02 0:00 ps aux .........省略部分輸出...........
- USER:該程序是由哪個使用者產生的。
- PID:程序的 ID。
- %CPU:該程序佔用 CPU 資源的百分比,佔用的百分比越高,程序越耗費資源。
- %MEM:該程序佔用實體記憶體的百分比,佔用的百分比越高,程序越耗費資源。
- VSZ:該程序佔用虛擬記憶體的大小,單位為 KB。
- RSS:該程序佔用實際實體記憶體的大小,單位為 KB。
- TTY:該程序是在哪個終端執行的。其中,tty1 ~ tty7 代表本地控制檯終端(可以通過 Alt+F1 ~ F7 快捷鍵切換不同的終端),tty1~tty6 是本地的字元介面終端,tty7 是圖形終端。pts/0 ~ 255 代表虛擬終端,一般是遠端連線的終端,第一個遠端連線佔用 pts/0,第二個遠端連線佔用 pts/1,依次増長。
- STAT:程序狀態。常見的狀態有以下幾種:
- -D:不可被喚醒的睡眠狀態,通常用於 I/O 情況。
- -R:該程序正在執行。
- -S:該程序處於睡眠狀態,可被喚醒。
- -T:停止狀態,可能是在後臺暫停或程序處於除錯狀態。
- -W:記憶體互動狀態(從 2.6 核心開始無效)。
- -X:死掉的程序(應該不會出現)。
- -Z:殭屍程序。程序已經中止,但是部分程式還在記憶體當中。
- -<:高優先順序(以下狀態在 BSD 格式中出現)。
- -N:低優先順序。
- -L:被鎖入記憶體。
- -s:包含子程序。
- -l:多執行緒(小寫 L)。
- -+:位於後臺。
- START:該程序的啟動時間。
- TIME:該程序佔用 CPU 的運算時間,注意不是系統時間。
- COMMAND:產生此程序的命令名。
ps -le 檢視系統中所有的程序
"ps aux"命令可以看到系統中所有的程序,"ps -le"命令也能看到系統中所有的程序。由於"-l"選項的作用,所以"ps -le"命令能夠看到更加詳細的資訊,比如父程序的 PID、優先順序等。 命令如下:
[[email protected] ~]# ps -le F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1 0 0 80 0 - 31674 ep_pol ? 00:00:05 systemd 4 R 0 12391 12146 0 80 0 - 34343 - pts/1 00:00:00 ps …省部分輸出…
- F:程序標誌,說明程序的許可權,常見的標誌有兩個;1:程序可以被複制,但是不能被執行;4:程序使用超級使用者許可權;
- S:程序狀態。具體的狀態和"psaux"命令中的 STAT 狀態一致;
- UID:執行此程序的使用者的 ID;
- PID:程序的 ID;
- PPID:父程序的 ID;
- C:該程序的 CPU 使用率,單位是百分比;
- PRI:程序的優先順序,數值越小,該程序的優先順序越高,越早被 CPU 執行;
- NI:程序的優先順序,數值越小,該程序越早被執行;
- ADDR:該程序在記憶體的哪個位置;
- SZ:該程序佔用多大記憶體;
- WCHAN:該程序是否執行。"-"代表正在執行;
- TTY:該程序由哪個終端產生;
- TIME:該程序佔用 CPU 的運算時間,注意不是系統時間;
- CMD:產生此程序的命令名;
ps -l 檢視系統中所有的程序
有時我不想看到所有的程序,只想檢視一下當前登入產生了哪些程序,命令如下:
[[email protected] ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 12146 12140 0 80 0 - 29009 wait pts/1 00:00:00 bash 0 R 0 12838 12146 0 80 0 - 34343 - pts/1 00:00:00 ps
可以看到,這次從 pts/1 虛擬終端登入,只產生了兩個程序:一個是登入之後生成的 Shell,也就是 bash;另一個是正在執行的 ps 命令。