1. 程式人生 > >Linux 程序管理 ps、top、pstree命令

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:程序狀態。常見的狀態有以下幾種:
    1. -D:不可被喚醒的睡眠狀態,通常用於 I/O 情況。
    2. -R:該程序正在執行。
    3. -S:該程序處於睡眠狀態,可被喚醒。
    4. -T:停止狀態,可能是在後臺暫停或程序處於除錯狀態。
    5. -W:記憶體互動狀態(從 2.6 核心開始無效)。
    6. -X:死掉的程序(應該不會出現)。
    7. -Z:殭屍程序。程序已經中止,但是部分程式還在記憶體當中。
    8. -<:高優先順序(以下狀態在 BSD 格式中出現)。
    9. -N:低優先順序。
    10. -L:被鎖入記憶體。
    11. -s:包含子程序。
    12. -l:多執行緒(小寫 L)。
    13. -+:位於後臺。
  • 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 命令。