1. 程式人生 > >Linux 程序管理 kill、killall、pkill命令

Linux 程序管理 kill、killall、pkill命令

Linux常用訊號(程序間通訊) 

系統中可以識別的訊號較多,我們可以使用命令"kill -l"或"man 7 signal"來查詢。命令如下:

[[email protected] ~]# 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    

常見的程序訊號最重要的就是 "1"、"9"、"15"這三個訊號 

訊號代號 訊號名稱 說 明
1 SIGHUP 該訊號讓程序立即關閉.然後重新讀取配置檔案之後重啟
2 SIGINT 程式中止訊號,用於中止前臺程序。相當於輸出 Ctrl+C 快捷鍵
8 SIGFPE 在發生致命的算術運算錯誤時發出。不僅包括浮點運算錯誤,還包括溢位及除數為 0 等其他所有的算術運算錯誤
9 SIGKILL 用來立即結束程式的執行。本訊號不能被阻塞、處理和忽略。般用於強制中止程序
14 SIGALRM 時鐘定時訊號,計算的是實際的時間或時鐘時間。alarm 函式使用該訊號
15 SIGTERM

正常結束程序的訊號,kill 命令的預設訊號。

如果程序已經發生了問題,那麼這個訊號是無法正常中止程序的,這時我們才會嘗試 SIGKILL訊號(訊號 9) 

18 SIGCONT 該訊號可以讓暫停的程序恢復執行。本訊號不能被阻斷
19 SIGSTOP 該訊號可以暫停前臺程序,相當於輸入 Ctrl+Z 快捷鍵。本訊號不能被阻斷

kill命令:終止程序

kill是用來殺死程序的命令。可以根據不同的訊號,kill 命令可以完成不同的操作,預設訊號是15,正常停止。kill 命令格式如下:

[[email protected] ~]# kill [訊號] PID

kill 命令是按照 PID 來確定程序的,所以 kill 命令只能識別 PID,而不能識別程序名。我們舉幾個例子來說明一下 kill 命令。

使用“-1”訊號,讓程序重啟

[[email protected] ~]# kill -1 程序號

 使用“-19”訊號,讓程序暫停

[[email protected] ~]# kill -19 程序號

killall命令:終止特定的一類程序

killall 命令不再依靠 PID 來殺死單個程序,而是通過程式的程序名來殺死一類程序。命令格式如下:

[[email protected] ~]# killall [選項] [訊號] 程序名

選項:

  • -i:互動式,詢問是否要殺死某個程序;
  • -l:忽略程序名的大小寫;

殺死httpd程序

#啟動RPM包預設安裝的apache服務
[[email protected] ~]# service httpd start
#檢視httpd程序
[[email protected] ~]# ps aux | grep "httpd" | grep -v "grep"
root 1600 0.0 0.2 4520 1696? Ss 19:42 0:00 /usr/local/apache2/bin/httpd -k start
daemon 1601 0.0 0.1 4520 1188? S 19:42 0:00 /usr/local/apache2/bin/httpd -k start
daemon 1602 0.0 0.1 4520 1188? S 19:42 0:00 /usr/local/apache2/bin/httpd -k start
daemon 1603 0.0 0.1 4520 1188? S 19:42 0:00 /usr/local/apache2/bin/httpd -k start
daemon 1604 0.0 0.1 4520 1188? S 19:42 0:00 /usr/local/apache2/bin/httpd -k start
daemon 1605 0.0 0.1 4520 1188? S 19:42 0:00 /usr/local/apache2/bin/httpd -k start                                                              
#殺死所有程序名是httpd的程序
[[email protected] ~]# killall httpd
#查詢發現所有的httpd程序都消失了
[[email protected] ~]# ps aux | grep "httpd" | grep -v "grep"

 互動式殺死sshd程序

#查詢系統中有3個sshd程序。1733是sshd服務的程序,1735和1758是兩個遠端連線的程序                                                                           
[[email protected] ~]# ps aux | grep "sshd" | grep -v "grep"
root 1733 0.0 0.1 8508 1008? Ss 19:47 0:00/usr/sbin/sshd
root 1735 0.1 0.5 11452 3296? Ss 19:47 0:00 sshd: [email protected]/0
root 1758 0.1 0.5 11452 3296? Ss 19:47 0:00 sshd: [email protected]/1
#互動式殺死sshd程序
[[email protected] ~]# killall -i sshd
#這個程序是sshd的服務程序,如果殺死,那麼所有的sshd連線都不能登陸
殺死sshd(1733)?(y/N)n
#這是當前登入終端,不能殺死我自己吧
殺死 sshd(1735)?(y/N)n
#殺死另一個sshd登陸終端
殺死 sshd(1758)?(y/N)y

pkill命令:終止程序,按終端號踢出使用者

pkill 命令和 killall 命令非常類似,也是按照程序名來殺死程序的。命令格式如下:

[[email protected] ~]# pkill [選項] [訊號] 程序名

選項:

  • -t 終端號:按照終端號踢出使用者;

不過 pkill 命令可以按照終端號來踢出使用者。不知道大家發現沒有,剛剛通過 killall 命令殺死 sshd 程序的方式來踢出使用者,非常容易誤殺死程序,要麼會把 sshd 服務殺死,要麼會把自己的登入終端殺死。

所以,不管是使用 kill 命令按照 PID 殺死登入程序,還是使用 killall 命令按照程序名殺死登入程序,都是非常容易誤殺死程序的。 具體命令如下:

#使用w命令査詢本機已經登入的使用者
[[email protected] ~]# w
20:06:34 up 28 min, 3 users, load average: 0.00, 0.00, 0.00
USER TTY FROM [email protected] IDLE JCPU PCPU WHAT
root ttyl - 19:47 18:52 0.01s 0.01s -bash
root pts/0 192.168.0.100 19:47 0.00s 0.09s 0.04s w
root pts/1 192.168.0.100 19:51 14:56 0.02s 0.02s -bash
#當前主機已經登入了三個root使用者,一個是本地終端ttyl登入,另外兩個是從192.168.0.100登陸的遠端登入                                                            
#強制殺死從pts/1虛擬終端登陸的程序
[[email protected] ~]# pkill -9 -t pts/1
#虛擬終端pts/1的登入程序已經被殺死了
[[email protected] ~]# w
20:09:09 up 30 min, 2 users, load average: 0.00, 0.00,0.00
USER TTY FROM [email protected] IDLE JCPU PCPU WHAT
root ttyl - 19:47 21:27 0.01s 0.01s -bash
root pts/0 192.168.0.100 19:47 0.00s 0.06s 0.00s w