ps 指令是最常用的監控程序的指令,通過此指令可以檢視系統中所有運作程序的詳細資訊。ps 指令有多種不同的使用方法,這常常給初學者帶來困惑。在各種 Linux 論壇上,詢問 ps 指令文法的文章屢見不鮮,而出現這樣的情況,還要歸咎于 UNIX 悠久的曆史和龐大的派系。在不同的 Linux 發行版上,ps 指令的文法各不相同,為此,Linux 采取了一個折中的方法,即融合各種不同的風格,兼顧那些已經習慣了其它系統上使用 ps 指令的使用者。ps 指令的基本格式如下:
[[email protected] ~]# ps aux
#檢視系統中所有的程序,使用 BS 作業系統格式
[[email protected] ~]# ps -le
#檢視系統中所有的程序,使用 Linux 标準指令格式
選項:
- a:顯示一個終端的所有程序,除會話引線外;
- u:顯示程序的歸屬使用者及記憶體的使用情況;
- x:顯示沒有控制終端的程序;
- -l:長格式顯示更加詳細的資訊;
- -e:顯示所有程序;
可以看到,ps 指令有些與衆不同,它的部分選項不能加入"-",比如指令"ps aux",其中"aux"是選項,但是前面不能帶“-”。大家如果執行 "man ps" 指令,則會發現 ps 指令的幫助為了适應不同的類 UNIX 系統,可用格式非常多,不友善記憶。是以,我建議大家記憶幾個固定選項即可。比如:
- "ps aux" 可以檢視系統中所有的程序;
- "ps -le" 可以檢視系統中所有的程序,而且還能看到程序的父程序的 PID 和程序優先級;
- "ps -l" 隻能看到目前 Shell 産生的程序;
有這三個指令就足夠了,下面分别來檢視。【例 1】
[[email protected] ~]# ps aux
#檢視系統中所有的程序
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 2872 1416 ? Ss Jun04 0:02 /sbin/init
root 2 0.0 0.0 0 0 ? S Jun04 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S Jun04 0:00 [migration/0]
root 4 0.0 0.0 0 0 ? S Jun04 0:00 [ksoftirqd/0]
…省略部分輸出…
表 1 中羅列出了以上輸出資訊中各列的具體含義。
表頭 | 含義 |
---|---|
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 | 程序狀态。常見的狀态有以下幾種:
|
START | 該程序的啟動時間。 |
TIME | 該程序占用 CPU 的運算時間,注意不是系統時間。 |
COMMAND | 産生此程序的指令名。 |
【例 2】"ps aux"指令可以看到系統中所有的程序,"ps -le"指令也能看到系統中所有的程序。由于 "-l" 選項的作用,是以 "ps -le" 指令能夠看到更加詳細的資訊,比如父程序的 PID、優先級等。但是這兩個指令的基本作用是一緻的,掌握其中一個就足夠了。
[[email protected] ~]# ps -le
F S UID PID PPID C PRI Nl ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 718 - ? 00:00:02 init
1 S 0 2 0 0 80 0 - 0 - ? 00:00:00 kthreadd
1 S 0 3 2 0 -40 - - 0 - ? 00:00:00 migration/0
1 S 0 4 2 0 80 0 - 0 - ? 00:00:00 ksoflirqd/0
1 S 0 5 2 0 -40 - - 0 - ? 00:00:00 migration/0
…省略部分輸出…
表 2 羅列出以上輸出資訊中各列的含義。
表頭 | 含義 |
---|---|
F | 程序标志,說明程序的權限,常見的标志有兩個:
|
S | 程序狀态。具體的狀态和"psaux"指令中的 STAT 狀态一緻; |
UID | 運作此程序的使用者的 ID; |
PID | 程序的 ID; |
PPID | 父程序的 ID; |
C | 該程序的 CPU 使用率,機關是百分比; |
PRI | 程序的優先級,數值越小,該程序的優先級越高,越早被 CPU 執行; |
NI | 程序的優先級,數值越小,該程序越早被執行; |
ADDR | 該程序在記憶體的哪個位置; |
SZ | 該程序占用多大記憶體; |
WCHAN | 該程序是否運作。"-"代表正在運作; |
TTY | 該程序由哪個終端産生; |
TIME | 該程序占用 CPU 的運算時間,注意不是系統時間; |
CMD | 産生此程序的指令名; |
【例 3】如果不想看到所有的程序,隻想檢視一下目前登入産生了哪些程序,那隻需使用 "ps -l" 指令就足夠了:
[[email protected] ~]# ps -l
#檢視目前登入産生的程序
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 18618 18614 0 80 0 - 1681 - pts/1 00:00:00 bash
4 R 0 18683 18618 4 80 0 - 1619 - pts/1 00:00:00 ps
可以看到,這次從 pts/1 虛拟終端登入,隻産生了兩個程序:一個是登入之後生成的 Shell,也就是 bash;另一個是正在執行的 ps 指令。我們再來說說僵屍程序。僵屍程序的産生一般是由于程序非正常停止或程式編寫錯誤,導緻子程序先于父程序結束,而父程序又沒有正确地回收子程序,進而造成子程序一直存在于記憶體當中,這就是僵屍程序。僵屍程序會對主機的穩定性産生影響,是以,在産生僵屍程序後,一定要對産生僵屍程序的軟體進行優化,避免一直産生僵屍程序;對于已經産生的僵屍程序,可以在查找出來之後強制中止。