基礎篇:
首先,用ps檢視程序,方法如下:
$ ps -aux
内容如下:
.......
root 17149 0.0 0.1 101700 3572 ? Ss 14:06 0:00 /home/pubsrc/php/bin/php-cgi --fpm --fpm-config /home/pubsrc/php/etc/php-fpm.conf
newby 17151 0.0 0.1 100380 3360 ? S 14:06 0:00 /home/pubsrc/php/bin/php-cgi --fpm --fpm-config /home/pubsrc/php/etc/php-fpm.conf
newby 17152 0.0 0.1 100380 3360 ? S 14:06 0:00 /home/pubsrc/php/bin/php-cgi --fpm --fpm-config /home/pubsrc/php/etc/php-fpm.conf
newby 17153 0.0 0.1 100380 3360 ? S 14:06 0:00 /home/pubsrc/php/bin/php-cgi --fpm --fpm-config /home/pubsrc/php/etc/php-fpm.conf
newby 17154 0.0 0.1 100380 3360 ? S 14:06 0:00 /home/pubsrc/php/bin/php-cgi --fpm --fpm-config /home/pubsrc/php/etc/php-fpm.conf
newby 17155 0.0 0.1 100380 3360 ? S 14:06 0:00 /home/pubsrc/php/bin/php-cgi --fpm --fpm-config /home/pubsrc/php/etc/php-fpm.conf
newby 17156 0.0 0.1 100380 3360 ? S 14:06 0:00 /home/pubsrc/php/bin/php-cgi --fpm --fpm-config /home/pubsrc/php/etc/php-fpm.conf
newby 17157 0.0 0.1 100380 3360 ? S 14:06 0:00 /home/pubsrc/php/bin/php-cgi --fpm --fpm-config /home/pubsrc/php/etc/php-fpm.conf
此時如果我想殺了php-cfi的程序就在終端輸入:
$ kill -s 9 17149等一系列信号
其中-s 9 制定了傳遞給程序的信号是9,即強制、盡快終止程序。各個終止信号及其作用見附錄。
17149則是上面ps查到的php-cgi的PID。
簡單吧,但有個問題,程序少了則無所謂,程序多了,就會覺得痛苦了,無論是ps -ef 還是ps -aux,每次都要在一大串程序資訊裡面查找到要殺的程序,看的眼都花了。
進階篇:
改進1:
把ps的查詢結果通過管道給grep查找包含特定字元串的程序。管道符“|”用來隔開兩個指令,管道符左邊指令的輸出會作為管道符右邊指令的輸入。
$ ps -aux | grep php-cgi
root 17149 0.0 0.1 101700 3572 ? Ss 14:06 0:00 /home/pubsrc/php/bin/php-cgi --fpm --fpm-config /home/pubsrc/php/etc/php-fpm.conf
newby 17151 0.0 0.1 100380 3360 ? S 14:06 0:00 /home/pubsrc/php/bin/php-cgi --fpm --fpm-config /home/pubsrc/php/etc/php-fpm.conf
這次就清爽了。然後就是
$kill -s 917149等一系列信号,還是麻煩
改進2——使用pgrep:
一看到pgrep首先會想到什麼?沒錯,grep!pgrep的p表明了這個指令是專門用于程序查詢的grep。
$ pgrep php-cgi17149
17151
17152
17153
17154
17155
$kill -s 917149等一系列信号,還是麻煩
改進3——使用pidof:
看到pidof想到啥?沒錯pid of xx,字面翻譯過來就是 xx的PID。
$ pidof php-cgi
17279 17278 17277 17276 17275 17274
和pgrep相比稍顯不足的是,pidof必須給出程序的全名。然後就是老生常談:
$kill -s 917149等一系列信号,還是麻煩
無論使用ps 然後慢慢查找程序PID 還是用grep查找包含相應字元串的程序,亦或者用pgrep直接查找包含相應字元串的程序pid,然後手動輸入給kill殺掉,都稍顯麻煩。有沒有更友善的方法?
改進4:
$ps -aux | grep php-cgi | grep -v grep | cut -c 9-15 | xargs kill -s 9
說明:
“grep php-cgi”的輸出結果是,所有含有關鍵字“php-cgi”的程序。
“grep -v grep”是在列出的程序中去除含有關鍵字“grep”的程序。
“cut -c 9-15”是截取輸入行的第9個字元到第15個字元,而這正好是程序号PID。
“xargs kill -s 9”中的xargs指令是用來把前面指令的輸出結果(PID)作為“kill -s 9”指令的參數,并執行該指令。“kill -s 9”會強行殺掉指定程序。
難道你不想抱怨點什麼?沒錯太長了
改進5:
知道pgrep和pidof兩個指令,幹嘛還要打那麼長一串!
$ pgrep php-cgi | xargs kill -s 9
注意:pidof php-cgi | xargs kill -s 9 的時候會有一個問題,pidof的程序号全在一行,會存在溢出的問題,有可能一次不能全部殺掉程序
改進6:
$ ps -ef | grep php-cgi | grep -v 'grep' | awk '{print $2}' | xargs kill -9
其中awk '{print $2}' 的作用就是列印(print)出第二列的内容。根據正常篇,可以知道ps輸出的第二列正好是PID。就把程序相應的PID通過xargs傳遞給kill作參數,殺掉對應的程序。
改進7:
難道每次都要調用xargs把PID傳遞給kill?答案是否定的:
$kill -s 9 `ps -aux | grep php-cgi | awk '{print $2}'`
改進8:
沒錯,指令依然有點長,換成pgrep。
$kill -s 9 `pgrep php-cgi`
改進9——pkill:
看到pkill想到了什麼?沒錯pgrep和kill!pkill=pgrep+kill。
$pkill -9 php-cgi
說明:"-9" 即發送的信号是9,pkill與kill在這點的差别是:pkill無須 “s”,終止信号等級直接跟在 “-“ 後面。之前我一直以為是 "-s 9",結果每次運作都無法終止程序。
改進10——killall:
killall和pkill是相似的,不過如果給出的程序名不完整,killall會報錯。pkill或者pgrep隻要給出程序名的一部分就可以終止程序。
$killall -9 php-cgi