系統中能夠識別的信號較多,咱們可使用命令"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 命令能夠完成不一樣的操做,默認信號是15,正常中止。kill 命令格式以下:spa
[root@localhost ~]# kill [信號] PID
kill 命令是按照 PID 來肯定進程的,因此 kill 命令只能識別 PID,而不能識別進程名。咱們舉幾個例子來講明一下 kill 命令。code
[root@localhost ~]# kill -1 進程號
[root@localhost ~]# kill -19 進程號
killall 命令再也不依靠 PID 來殺死單個進程,而是經過程序的進程名來殺死一類進程。命令格式以下:blog
[root@localhost ~]# killall [選項] [信號] 進程名
選項:進程
#啓動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"
#查詢系統中有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 命令和 killall 命令很是相似,也是按照進程名來殺死進程的。命令格式以下:table
[root@localhost ~]# pkill [選項] [信號] 進程名
選項:class
不過 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