在linux中,通常執行任何一個命令都會創建一個或多個進程,即命令是通過進程實現的。當進程完成了預期的目標,自行終止時,該命令也就執行完了。不但用戶可以創建進程,系統程序也可以創建進程。可以說,一個運行著的操作系統就是由許許多多的進程組成的。
ps命令
ps命令是查看進程狀態的最常用的命令,它可以提供關于進程的許多信息。操作者可以根據顯示的信息確定哪個進程正在運行,哪個進程是被掛起或出了問題,進程已運行了多久,進程正在使用的資源情況,進程的相對優先級以及進程的標識號(PID)。所有這些信息對用戶都很有用,對于系統管理員來說更為重要。
ps命令的一般格式是: ps [選項]
Ps命令的常用選項有:
-a 顯示系統中與tty相關的(除會話組長之外)所有進程的信息。
-e 顯示所有進程的信息。
-f 顯示進程的所有信息。
-l 以長格式顯示進程信息。
-r 只顯示正在運行的進程。
-u 顯示面向用戶的格式(包括用戶名,CPU及內存使用情況、進程運行狀態等信息)。
-x 顯示所有終端上的進程信息。
不帶選項的ps命令可以列出每個與當前shell有關的進程的基本信息:
其中,各字段的含義如下:
PID 進程標識號。
TTY 該進程建立時所對應的終端,“?”表示該進程不占用終端。
TIME 報告進程累計使用的CPU時間。注意,盡管有些命令(如sh)已經運轉了很長時間,但是它們真正使用CPU的時間往往很短。所以,該字段的值往往是00:00:00。
CMD 執行進程的命令名,command的縮寫。
kill命令
信號(signal,也稱作軟中斷)機制是在軟件層次上對中斷機制的一種模擬。異步進程可以通過彼此發送信號來實現簡單通信。系統預先規定若干個不同類型的信號(如x86平臺中Linux內核設置了32種信號,而現在的Linux和POSIX.4定義了64種信號),各表示發生了不同的事件,每個信號對應一個編號。進程遇到相應事件或者出現特定要求時(如進程終止或運行中出現某些錯誤——非法指令和地址越界等),就把一個信號寫到相應進程task_struct結構的signal位圖(表示信號的整數)中。接收信號的進程在運行過程中要檢測自身是否收到了信號,如果已收到信號,則轉去執行預先規定好的信號處理程序。在處理之后,再返回原先正在執行的進程。
kill命令是通過向指定進程發送指定的信號來終止相應進程。終止一個前臺進程可以使用<Ctrl+C>鍵,也可以使用kill命令。但是,對于一個后臺進程就只能用kill命令來終止。
kill命令的一般格式是:
kill [-s 信號|-p ] 進程號…
kill -l [信號]
其中,各選項的含義如下:
-s 指定要發送的信號——可以是信號名(如SIGKILL),也可以是對應信號的編號(如9)。
-p 指定kill命令只是顯示進程的PID(進程標識號),并不真正發出終止進程的信號。
-l 顯示信號名稱列表,這也可以在
/usr/include/linux/signal.h文件中找到。
使用kill命令時應注意:
(1)kill命令可以帶信號,也可以不帶。如果沒有帶信號,kill命令就會發出終止信號(編號為15),這個信號可以被進程捕獲,使得進程在退出之前清理并釋放資源。也可以用kill向進程發送特定的信號,例如:kill -2 123 。它的效果等同于:當在前臺運行PID為123的進程時,按下<Ctrl+C>鍵。但是,普通用戶使用kill命令時不要帶信號,或者至多帶信號編號9。
(2)kill可以用進程ID號作為參數。當用kill向這些進程發送信號時,必須是這些進程的主人。如果試圖撤銷一個沒有權限撤銷的進程或撤銷一個不存在的進程,就會得到一個錯誤信息。
(3)可以向多個進程發信號或終止它們。
(4)當kill成功地發送了信號后,shell會在屏幕上顯示出進程的終止信息。有時這個信息不會馬上顯示,只有當按下鍵使shell的命令提示符再次出現時,才會顯示出來。
(5)應注意,信號使進程強行終止,這常會帶來一些副作用,如數據丟失或者終端無法恢復到正常狀態。發送信號時必須小心,只有在萬不得已時,才用SIGKILL信號(編號為9),因為進程不能首先捕獲它。
要撤銷所有的后臺作業,可以輸入kill 0。因為有些在后臺運行的命令會啟動多個進程,跟蹤并找到所有要殺掉的進程的PID是件很麻煩的事。這時,使用kill 0 來終止所有由當前shell啟動的進程,是個有效的方法。
sleep命令
sleep命令的功能是使進程暫停執行一段時間。
其一般使用格式是:
sleep 時間值
其中,“時間值”參數以秒為單位,即讓進程暫停由時間值所指定的秒數。此命令大多用于shell程序設計中,使兩條命令執行之間停頓指定的時間。
例如,下面的命令使進程先暫停100秒,然后查看用戶test00001是否在系統中:
[root@VM_255_145_centos ~]# sleep 100;who |grep 'test00001'