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

Linux經常使用信號(進程間通訊) 

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

[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"這三個信號 bash

信號代號 信號名稱 說 明
1 SIGHUP 該信號讓進程當即關閉.而後從新讀取配置文件以後重啓
2 SIGINT 程序停止信號,用於停止前臺進程。至關於輸出 Ctrl+C 快捷鍵
8 SIGFPE 在發生致命的算術運算錯誤時發出。不只包括浮點運算錯誤,還包括溢出及除數爲 0 等其餘全部的算術運算錯誤
9 SIGKILL 用來當即結束程序的運行。本信號不能被阻塞、處理和忽略。般用於強制停止進程
14 SIGALRM 時鐘定時信號,計算的是實際的時間或時鐘時間。alarm 函數使用該信號
15 SIGTERM

正常結束進程的信號,kill 命令的默認信號。ssh

若是進程已經發生了問題,那麼這個信號是沒法正常停止進程的,這時咱們纔會嘗試 SIGKILL信號(信號 9) 函數

18 SIGCONT 該信號可讓暫停的進程恢復執行。本信號不能被阻斷
19 SIGSTOP 該信號能夠暫停前臺進程,至關於輸入 Ctrl+Z 快捷鍵。本信號不能被阻斷

kill命令:終止進程

kill是用來殺死進程的命令。能夠根據不一樣的信號,kill 命令能夠完成不一樣的操做,默認信號是15,正常中止。kill 命令格式以下:spa

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

kill 命令是按照 PID 來肯定進程的,因此 kill 命令只能識別 PID,而不能識別進程名。咱們舉幾個例子來講明一下 kill 命令。code

使用「-1」信號,讓進程重啓

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

 使用「-19」信號,讓進程暫停

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

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

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

[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 命令很是相似,也是按照進程名來殺死進程的。命令格式以下:table

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

選項:class

  • -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
相關文章
相關標籤/搜索