Linux下kill命令


首先了解什么是信號:信號是進程級的中斷請求,系統定義了30余種信號,kill是管理員用來發送信號的一種手段。

功能說明:刪除執行中的程序或工作。

語  法:kill [-s <信息名稱或編號>][程序] 或 kill [-l <信息編號>]
補充說明:kill可將指定的信息送至程序。預設的信息為SIGTERM(15),可將指定程序終止。若仍無法終止該程序,可使用SIGKILL(9)信息嘗試強制刪除程序。程序或工作的編號可利用ps指令或jobs指令查看。 
參  數:
 -l <信息編號>  若不加<信息編號>選項,則-l參數會列出全部的信息名稱。 
 -s <信息名稱或編號>  指定要送出的信息。 
 [程序]  [程序]可以是程序的PID或是PGID,也可以是工作編號。 

kill命令可以從kill這個詞來大致了解下它的作用,是的,它用來殺死(kill)一個進程。下面是kill命令的詳解。

1.作用 
kill命令用來中止一個進程。 

2.格式 
kill [ -s signal | -p ] [ -a ] pid ... 
kill -l [ signal ] 

3.參數 
-s:指定發送的信號。 
-p:模擬發送信號。 
-l:指定信號的名稱列表。 
pid:要中止進程的ID號。 
Signal:表示信號。 

4.說明 
進程是Linux系統中一個非常重要的概念。Linux是一個多任務的操作系統,系統上經常同時運行着多個進程。我們不關心這些進程究竟是如何分配的,或者是內核如何管理分配時間片的,所關心的是如何去控制這些進程,讓它們能夠很好地為用戶服務。 

Linux操作系統包括三種不同類型的進程,每種進程都有自己的特點和屬性。交互進程是由一個Shell啟動的進程。交互進程既可以在前台運行,也可以在后台運行。批處理進程和終端沒有聯系,是一個進程序列。監控進程(也稱系統守護進程)時Linux系統啟動時啟動的進程,並在后台運行。例如,httpd是著名的Apache服務器的監控進程。 

kill命令的工作原理是,向Linux系統的內核發送一個系統操作信號和某個程序的進程標識號,然后系統內核就可以對進程標識號指定的進程進行操作。比如在top命令中,我們看到系統運行許多進程,有時就需要使用kill中止某些進程來提高系統資源。在講解安裝和登陸命令時,曾提到系統多個虛擬控制台的作用是當一個程序出錯造成系統死鎖時,可以切換到其它虛擬控制台工作關閉這個程序。此時使用的命令就是kill,因為kill是大多數Shell內部命令可以直接調用的。 

5.應用實例 
(1)強行中止(經常使用殺掉)一個進程標識號為324的進程: 
#kill -9 324 

(2)解除Linux系統的死鎖 
在Linux中有時會發生這樣一種情況:一個程序崩潰,並且處於死鎖的狀態。此時一般不用重新啟動計算機,只需要中止(或者說是關閉)這個有問題的程序即可。當kill處於X-Window界面時,主要的程序(除了崩潰的程序之外)一般都已經正常啟動了。此時打開一個終端,在那里中止有問題的程序。比如,如果Mozilla瀏覽器程序出現了鎖死的情況,可以使用kill命令來中止所有包含有Mozolla瀏覽器的程序。首先用top命令查處該程序的 PID,然后使用kill命令停止這個程序: 
#kill -SIGKILL XXX 
其中,XXX是包含有Mozolla瀏覽器的程序的進程標識號。 

(3)使用命令回收內存 
我們知道內存對於系統是非常重要的,回收內存可以提高系統資源。kill命令可以及時地中止一些“越軌”的程序或很長時間沒有相應的程序。例如,使用top命令發現一個無用 (Zombie) 的進程,此時可以使用下面命令: 
#kill -9 XXX 
其中,XXX是無用的進程標識號。 

然后使用下面命令: 
#free 
此時會發現可用內存容量增加了。 

(4)killall命令 
Linux下還提供了一個killall命令,可以直接使用進程的名字而不是進程標識號,例如: 
# killall -HUP inetd 

6.各種信號及其用途

# kill -l
 1) SIGHUP     2) SIGINT     3) SIGQUIT     4) SIGILL     5) SIGTRAP
 6) SIGABRT     7) SIGBUS     8) SIGFPE     9) SIGKILL    10) SIGUSR1
11) SIGSEGV    12) SIGUSR2    13) SIGPIPE    14) SIGALRM    15) SIGTERM
16) SIGSTKFLT    17) SIGCHLD    18) SIGCONT    19) SIGSTOP    20) SIGTSTP
21) SIGTTIN    22) SIGTTOU    23) SIGURG    24) SIGXCPU    25) SIGXFSZ
26) SIGVTALRM    27) SIGPROF    28) SIGWINCH    29) SIGIO    30) SIGPWR
31) SIGSYS    34) SIGRTMIN    35) SIGRTMIN+1    36) SIGRTMIN+2    37) SIGRTMIN+3
38) SIGRTMIN+4    39) SIGRTMIN+5    40) SIGRTMIN+6    41) SIGRTMIN+7    42) SIGRTMIN+8
43) SIGRTMIN+9    44) SIGRTMIN+10    45) SIGRTMIN+11    46) SIGRTMIN+12    47) SIGRTMIN+13
48) SIGRTMIN+14    49) SIGRTMIN+15    50) SIGRTMAX-14    51) SIGRTMAX-13    52) SIGRTMAX-12
53) SIGRTMAX-11    54) SIGRTMAX-10    55) SIGRTMAX-9    56) SIGRTMAX-8    57) SIGRTMAX-7
58) SIGRTMAX-6    59) SIGRTMAX-5    60) SIGRTMAX-4    61) SIGRTMAX-3    62) SIGRTMAX-2
63) SIGRTMAX-1    64) SIGRTMAX    

信號詳解參考:http://www.cnblogs.com/oskb/p/3460089.html

7.其他實例

1)停止Tail進程然后重新啟動它繼續運行

# ps -aux |grep tail
root     20664  0.0  0.0 100848   584 pts/1    S+   10:00   0:00 tail -f /var/log/messages
root     20666  0.0  0.0 103152   812 pts/2    S+   10:00   0:00 grep tail
# kill -s STOP 20664
# ps -aux |grep tail
root     20664  0.0  0.0 100848   584 pts/1    T    10:00   0:00 tail -f /var/log/messages
root     20668  0.0  0.0 103152   816 pts/2    S+   10:00   0:00 grep tail
# kill -s CONT 20664
# ps -aux |grep tail
root     20664  0.0  0.0 100848   584 pts/1    S    10:00   0:00 tail -f /var/log/messages
root     20686  0.0  0.0 103152   816 pts/2    S+   10:01   0:00 grep tail

 

 8.注意事項

*殺死進程最安全的方法是單純使用kill命令,不加修飾符,不帶標志。 
首先使用ps -ef命令確定要殺死進程的PID,然后輸入以下命令: 
# kill -pid 
注釋:標准的kill命令通常都能達到目的。終止有問題的進程,並把進程的資源釋放給系統。然而,如果進程啟動了子進程,只殺死父進程,子進程仍在運行,因此仍消耗資源。為了防止這些所謂的“僵屍進程”,應確保在殺死父進程之前,先殺死其所有的子進程。 
-------------------------------------------------------------------------------- 
*確定要殺死進程的PID或PPID 
# ps -ef | grep httpd 
*以優雅的方式結束進程 
# kill -l PID

-l選項告訴kill命令用好像啟動進程的用戶已注銷的方式結束進程。當使用該選項時,kill命令也試圖殺死所留下的子進程。但這個命令也不是總能成功--或許仍然需要先手工殺死子進程,然后再殺死父進程。 
-------------------------------------------------------------------------------- 

*TERM信號 
給父進程發送一個TERM信號,試圖殺死它和它的子進程。 
# kill -TERM PPID 
-------------------------------------------------------------------------------- 
*killall命令 
killall命令殺死同一進程組內的所有進程。其允許指定要終止的進程的名稱,而非PID。 
# killall httpd 
-------------------------------------------------------------------------------- 
*停止和重啟進程 
有時候只想簡單的停止和重啟進程。如下: 
# kill -HUP PID 
該命令讓Linux和緩的執行進程關閉,然后立即重啟。在配置應用程序的時候,這個命令很方便,在對配置文件修改后需要重啟進程時就可以執行此命令。 
-------------------------------------------------------------------------------- 
*絕殺 kill -9 PID 
同意的 kill -s SIGKILL 
這個強大和危險的命令迫使進程在運行時突然終止,進程在結束后不能自我清理。危害是導致系統資源無法正常釋放,一般不推薦使用,除非其他辦法都無效。 
當使用此命令時,一定要通過ps -aux確認沒有剩下任何僵屍進程。只能通過終止父進程來消除僵屍進程。如果僵屍進程被init收養,問題就比較嚴重了。殺死init進程意味着關閉系統。如果系統中有僵屍進程,並且其父進程是init,而且僵屍進程占用了大量的系統資源,那么就需要在某個時候重啟機器以清除進程表了。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM