LINUX下kill掉多個類似程式的妙招

lsm_3036發表於2011-04-08

工作中經常需要Kill多個程式,如果這些程式有共同的特點,就可以用一條命令Kill掉它們。比如清除Oracle資料庫的所有遠端連線程式:
9802 122-13:54:36 xxx (LOCAL=NO)
11547 126-19:48:23 xxx (LOCAL=NO)
13016 101-20:48:45 xxx (LOCAL=NO)
19104 124-21:08:27 xxx (LOCAL=NO)
20515 105-15:35:56 xxx (LOCAL=NO)

ps -efww|grep LOCAL=NO|grep -v grep|cut -c 9-15|xargs kill -9

管道符“|”用來隔開兩個命令,管道符左邊命令的輸出會作為管道符右邊命令的輸入。下面說說用管道符聯接起來的幾個命令:

“ps -efww”是檢視所有程式的命令。這時檢索出的程式將作為下一條命令“grep LOCAL=NO”的輸入。

“grep LOCAL=NO”的輸出結果是,所有含有關鍵字“LOCAL=NO”的程式,這是Oracle資料庫中遠端連線程式的共同特點。

“grep -v grep”是在列出的程式中去除含有關鍵字“grep”的程式。

“cut -c 9-15”是擷取輸入行的第9個字元到第15個字元,而這正好是程式號PID。

“xargs kill -9”中的xargs命令是用來把前面命令的輸出結果(PID)作為“kill -9”命令的引數,並執行該命令。“kill -9”會強行殺掉指定程式,這樣就成功清除了oracle的所有遠端連線程式。其它類似的任務,只需要修改“grep LOCAL=NO”中的關鍵字部分就可以了。

也可以使用AWK來做這樣的事情

呵呵,經過一番努力終於寫了一條命令來殺掉執行超過7天的程式:

9802 122-13:54:36 xxx (LOCAL=NO)
11547 126-19:48:23 xxx (LOCAL=NO)
13016 101-20:48:45 xxx (LOCAL=NO)
19104 124-21:08:27 xxx (LOCAL=NO)
20515 105-15:35:56 xxx (LOCAL=NO)

ps -e -o pid -o etime -o args|grep LOCAL=NO|grep -| \
awk '{ if (int(substr($2,1,index($2,"-")-1))>7) {print $1;} }'| \
xargs kill -9
ps: 其實,這麼寫也是可以的,有興趣的同學可以當作學學awk語法羅:

ps -e -o pid -o etime -o args|grep LOCAL=NO|grep -| \
awk '{ split($2,arr,"-"); if (arr[1]>7) {print $1;} }'| \
xargs kill -9

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16978544/viewspace-691923/,如需轉載,請註明出處,否則將追究法律責任。

相關文章