ps 命令是最常用的監控進程的命令,通過此命令可以查看系統中所有運行進程的詳細信息。
ps 命令有多種不同的使用方法,這常常給初學者帶來困惑。在各種 Linux 論壇上,詢問 ps 命令語法的帖子屢見不鮮,而出現這樣的情況,還要歸咎於 UNIX 悠久的歷史和龐大的派系。在不同的 Linux 發行版上,ps 命令的語法各不相同,為此,Linux 採取了一個折中的方法,即融合各種不同的風格,兼顧那些已經習慣了其它系統上使用 ps 命令的用戶。
ps 命令的基本格式如下:
[root@localhost ~]# ps aux
#查看系統中所有的進程,使用 BS 作業系統格式
[root@localhost ~]# ps -le
#查看系統中所有的進程,使用 Linux 標準命令格式
選項:
a:顯示一個終端的所有進程,除會話引線外;
u:顯示進程的歸屬用戶及內存的使用情況;
x:顯示沒有控制終端的進程;
-l:長格式顯示更加詳細的信息;
-e:顯示所有進程;
可以看到,ps 命令有些與眾不同,它的部分選項不能加入"-",比如命令"ps aux",其中"aux"是選項,但是前面不能帶「-」。
大家如果執行 "man ps" 命令,則會發現 ps 命令的幫助為了適應不同的類 UNIX 系統,可用格式非常多,不方便記憶。所以,我建議大家記憶幾個固定選項即可。比如:
有這三個命令就足夠了,下面分別來查看。
【例 1】
[root@localhost ~]# 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 中羅列出了以上輸出信息中各列的具體含義。
-D:不可被喚醒的睡眠狀態,通常用於 I/O 情況。
-R:該進程正在運行。
-S:該進程處於睡眠狀態,可被喚醒。
-T:停止狀態,可能是在後臺暫停或進程處於除錯狀態。
-W:內存交互狀態(從 2.6 內核開始無效)。
-X:死掉的進程(應該不會出現)。
-Z:殭屍進程。進程已經中止,但是部分程序還在內存當中。
-<:高優先級(以下狀態在 BSD 格式中出現)。
-N:低優先級。
-L:被鎖入內存。
-s:包含子進程。
-l:多線程(小寫 L)。
-+:位於後臺。
START該進程的啟動時間。TIME該進程佔用 CPU 的運算時間,注意不是系統時間。COMMAND產生此進程的命令名。
【例 2】"ps aux"命令可以看到系統中所有的進程,"ps -le"命令也能看到系統中所有的進程。由於 "-l" 選項的作用,所以 "ps -le" 命令能夠看到更加詳細的信息,比如父進程的 PID、優先級等。但是這兩個命令的基本作用是一致的,掌握其中一個就足夠了。
[root@localhost ~]# 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 羅列出以上輸出信息中各列的含義。
1:進程可以被複製,但是不能被執行;
4:進程使用超級用戶權限;
S進程狀態。具體的狀態和"psaux"命令中的 STAT 狀態一致;UID運行此進程的用戶的 ID;PID進程的 ID;PPID父進程的 ID;C該進程的 CPU 使用率,單位是百分比;PRI進程的優先級,數值越小,該進程的優先級越高,越早被 CPU 執行;NI進程的優先級,數值越小,該進程越早被執行;ADDR該進程在內存的哪個位置;SZ該進程佔用多大內存;WCHAN該進程是否運行。"-"代表正在運行;TTY該進程由哪個終端產生;TIME該進程佔用 CPU 的運算時間,注意不是系統時間;CMD產生此進程的命令名;
【例 3】如果不想看到所有的進程,只想查看一下當前登錄產生了哪些進程,那只需使用 "ps -l" 命令就足夠了:
[root@localhost ~]# 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 命令。
我們再來說說殭屍進程。殭屍進程的產生一般是由於進程非正常停止或程序編寫錯誤,導致子進程先於父進程結束,而父進程又沒有正確地回收子進程,從而造成子進程一直存在於內存當中,這就是殭屍進程。
殭屍進程會對主機的穩定性產生影響,所以,在產生殭屍進程後,一定要對產生殭屍進程的軟體進行優化,避免一直產生殭屍進程;對於已經產生的殭屍進程,可以在查找出來之後強制中止。