Linux系統的進程管理
2024-07-21 02:36:09
供稿:網友
作者: TechRepublic.com
Thursday, February 13 2003 3:34 PM 在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)。
表A示例了ps aux命令的輸出。
現在還有其它更多的信息,增加了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狀態的進程。假如大部分進程處在睡眠狀態而又有問題發生,那么只關注那些正在運行的進程是最好的方法。那種狀態不一定能說明發生了問題,但是有時候假如進程運行的時間過長可能意味著發生了某些深層次的問題。
用top監視進程
另外一個有用的程序就是top。這個程序和ps類似,但是通常會全屏顯示,而且會隨著進程狀態的變化不斷更新。對于那些經常引發問題,而用ps又難以查看的程序而言,這個命令是很有用的。整個系統的信息也會顯示,這就為著手查找問題提供了便利。系統總共有多少CPU和內存資源以及負載平衡等信息本身就是很有用的,再加上程序列表以及程序當前的狀態和各自的統計信息,你現在可以理解為什么top這么常用了。
不要忘了pstree
最后,另外一個可以快速簡單查看進程的命令是pstree。這個命令會列出當前的進程以及它們的樹結構。一個進程啟動的時候可能會產生自己的一個子進程。運行pstree命令就可以很輕易地看到這些信息。
$ pstree -cp 125
httpd(125)-+-httpd(126)
-httpd(127)
-httpd(129)
`-httpd(130)
Httpd是個很好的例子,因為它會經常產生子進程。
在上例中你可以看到PID為125的樹。假如你想終止httpd但是又不想結束所有單個的子進程,那么找父進程。pstree命令可以列出所有單個進程對應的樹或者系統中的所有進程。它不僅可以幫助你找到發生異常的進程,還可以作為一個學習工具。用戶可以通過執行這些命令學到Linux的很多東西,還可以參考相關的幫助頁。
治理進程
假如你學會了用ps和top這些命令監視進程,你還應該知道怎么治理進程。你可以用kill、killall和renice這些命令實現進程治理。
"kill"命令向正在運行的進程發送信號。最常見的應用就是用它來停止程序的執行。你首先要獲得運行進程的PID(比如可以用ps aux命令),然后可以用如下命令終止進程:
$ kill 125
$ kill -9 125
通常情況下這個命令可以終止進程125。需要強調的是你要么是這個進程的屬主,要么是根用戶,否則不能終止這個進程。有時候單純用一個kill命令并不能終止進程,你還需要以下操作:
假如進程掛起而且沒有正常回應,那么可以用"-9"標志來結束這個進程,上例指明了這個過程。通常的kill命令是發送一個sigterm信號,而-9發送的是sigkill信號,這個信號強迫程序終止。其它一些信號可以用于終止或者啟動進程。你可以運行"kill -l"命令,然后就可以看到這些內容。
Killall命令與kill命令很相似,但是接收不同的參數。你可以向它傳送一個程序名而不是PID。以這個程序名運行的所有進程都會被終止。只要你是程序的屬主或者是根用戶那么就可以終止這個程序。所以運行killall tcpdump命令會終止所有tcpdump程序的實例。假如有很多進程以同樣的名字運行,這一點是很有用的。
一定要注重你在終止什么進程,非凡在你是根用戶的時候。終止了不適當的進程可能終止你的會話甚至讓整個系統都停止運行。你應該熟悉那些標準的運行進程以及它們的資源使用情況。假如想防止系統問題發生,最好設置一個基線。
還記不記得我先前提到可以改變進程的優先級?你可以用renice命令實現。改變優先級可以通知系統給某個進程更多或者更少的CPU時間。進程優先級("niceness")的范圍從-20到20,-20是最高的優先級。所以假如想要減小httpd進程125的優先級,你可以運行下面的命令:
$ renice +20 125
你可以通過改變優先級來節省系統資源。系統可以自動改變優先級,每當這種情況發生的時候,很可能意味著一個程序占用了比正常情況下更多的資源。
加速問題解決過程
能夠監視和控制Linux系統中的進程是很必要的。ps、top、kill和renice這些程序可以讓你看到進程的運行情況并且對它進行控制。你對每個進程了解得越多,就能夠越輕易地精確定位進程的問題所在。系統通常會因為某種原因碰到各種問題,比如速度變慢或者不穩定,而使用這些工具可以幫助你提高找到問題所在的能力。