天天看點

linux 中殺死php 程序,linux下殺死程序的10種方法

基礎篇:

首先,用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