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

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

我們 n) 關閉 本機 通信 操作 sig apache服務 沒有

Linux常用信號(進程間通信)

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

[root@localhost ~]# 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 命令格式如下:

[root@localhost ~]# kill
[信號] PID

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

使用“-1”信號,讓進程重啟

[root@localhost ~]# kill -1 進程號

使用“-19”信號,讓進程暫停

[root@localhost ~]# kill -19 進程號

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

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

[root@localhost ~]# killall [選項] [信號] 進程名

選項:

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

殺死httpd進程

#啟動RPM包默認安裝的apache服務
[root@localhost ~]# service httpd start
#查看httpd進程
[root@localhost ~]# 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的進程
[root@localhost ~]# killall httpd
#查詢發現所有的httpd進程都消失了
[root@localhost ~]# ps aux | grep "httpd" | grep -v "grep"

交互式殺死sshd進程

#查詢系統中有3個sshd進程。1733是sshd服務的進程,1735和1758是兩個遠程連接的進程                                                                           
[root@localhost ~]# 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: root@pts/0
root 1758 0.1 0.5 11452 3296? Ss 19:47 0:00 sshd: root@pts/1
#交互式殺死sshd進程
[root@localhost ~]# killall -i sshd
#這個進程是sshd的服務進程,如果殺死,那麽所有的sshd連接都不能登陸
殺死sshd(1733)?(y/N)n
#這是當前登錄終端,不能殺死我自己吧
殺死 sshd(1735)?(y/N)n
#殺死另一個sshd登陸終端
殺死 sshd(1758)?(y/N)y

pkill命令:終止進程,按終端號踢出用戶

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

[root@localhost ~]# pkill [選項] [信號] 進程名

選項:

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

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

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

#使用w命令査詢本機已經登錄的用戶
[root@localhost ~]# w
20:06:34 up 28 min, 3 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ 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虛擬終端登陸的進程
[root@localhost ~]# pkill -9 -t pts/1
#虛擬終端pts/1的登錄進程已經被殺死了
[root@localhost ~]# w
20:09:09 up 30 min, 2 users, load average: 0.00, 0.00,0.00
USER TTY FROM LOGIN@ 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

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