在Linux系統裡,當前正在運行的程序實例稱為進程。比如,當你啟動Apache的時候,系統會為它分配一個進程ID。然後就可以用這個ID監視和控制這個程序。
進程監視和控制是任何Linux系統管理員的核心任務。一個管理員可以終止("kill")、重啟一個進程,甚至可以為它指定一個不同的優先級。標准的Linux命令"ps"和"top"通常用於查看當前的進程列表。下面我來說明如何用這些命令和其它命令來管理Linux系統中的進程。
用ps監視進程
一個監視Linux的標准工具就是"ps",它是進程狀態的簡稱。這個命令返回正在運行的程序的信息。這些信息可能包括程序是在哪個用戶名下運行的,使用了多少CPU以及運行了多長時間。如果你要手工終止程序或者確定是哪個程序讓系統變慢時,這些信息是很有用的。
如果你只是鍵入了"ps"這個命令,那麼只能列出運行在當前終端下的進程。下面的例子是通過遠程shell運行"ps"輸出的結果:
$ ps
PID TTY TIME CMD
4684 pts/14 00:00:00 bash
27107 pts/14 00:00:00 ps
從輸出可以看出,分配給這個用戶/終端的進程只有Bash shell和ps命令本身。你還可以看到為每個進程列出的PID(進程ID)和TTY、TIME和CMD。TTY指明這個進程正在運行在哪個終端上,TIME指明了這個進程已經使用了多少CPU時間,CMD則是啟動這個進程的命令名稱。
用戶可以看到,標准的ps命令只能列出基本的信息。要想獲得Linux系統上運行的進程的詳細信息,你必須加入一些命令行參數。
加入ps常用的aux參數後可以顯示其他用戶啟動的進程(a)、查看系統中屬於自己的進程(x)以及啟動這個進程的用戶和它啟動的時間(u)。
現在還有其它更多的信息,增加了USER、 %CPU、%MEM、 VSZ、RSS、STAT和START這幾個域。現在我們來看一下這些信息是什麼含義。
首先,用戶可以看到所有的進程,而不僅僅是運行在終端上的那些。USER域指明了是哪個用戶啟動了這個命令。很多進程和系統一起啟動,而且會把根或者一些系統帳號列為USER。當然,其它一些進程是單獨運行的。這個信息本身就可以幫助你縮小問題范圍。假如某個用戶啟動了腳本,占用了服務器大量的I/O。如果能馬上找到是誰在運行這個程序,那麼就可以大大加快解決問題的速度。
%CPU、 %MEM、VSZ和RSS這幾個域都與系統資源有關。首先,用戶可以查看某個進程占用了多少CPU。這個信息是實時顯示的,所以很難用ps捕捉峰值。可能用戶會發現,為了找到引發問題的那個進程需要不停地運行ps命令。
除了CPU使用情況,還可以看到內存使用及其VSZ(虛擬內存大小)和RSS(常駐集大小)。VSZ表示如果一個程序完全駐留在內存的話需要占用多少內存空間,而RSS指明了當前實際占用了多少內存。如果能夠了解一個進程當前占用了多少內存,那麼就可以確定這個進程是在正常運行還是出現了異常。程序通常都會消耗比正常情況更多的內存和CPU。雖然程序員都在盡力確保代碼正確地使用資源,但是有時候還是要由管理員來決定終止還是重啟進程。
用戶可能會注意到在ps aux命令的輸出結果裡,大部分TTY域有個"?"。這是因為這些程序或者在系統啟動的時候就開始運行了,或者是由初始化腳本(init script)啟動的。這些進程沒有控制終端,所以作了標記。另外,linux-sanity-check命令有一個TTY的值為pts/14。這個命令是遠程連接運行的,有與其關聯的一個終端。當你的機器開放了多條連接,而你又想確定某個命令運行在哪個窗口的時候,這個信息是很有用的。
STAT顯示了進程當前的狀態。在我們的例子裡,很多進程處在睡眠狀態,STAT域裡的"S"指明了這一狀態。這僅僅表明這些進程在等待某些事件發生--可能是用戶輸入或者系統資源的可用性。linux-sanity-check命令則有一個R狀態,這個狀態表明進程當前正在運行。有時候你可以浏覽一下這個列表然後找那些R狀態的進程。如果大部分進程處在睡眠狀態而又有問題發生,那麼只關注那些正在運行的進程是最好的方法。那種狀態不一定能說明發生了問題,但是有時候如果進程運行的時間過長可能意味著發生了某些深層次的問題。