2017-01-03 103 views
2

我想在while循環中殺死lsof給出的所有進程。在while循環中kill不工作

這工作得很好:

lsof -i tcp | grep -v iceweasel | awk '{ print $2 }' | while read -r line 
do 
    echo "$line" 

done; 

這一個不:

lsof -i tcp | grep -v iceweasel | awk '{ print $2 }' | while read -r line 
    do 
     kill "$line" 

    done; 

錯誤的這最後而產生的是:

./kill.all.sh: line 6: kill: PID: arguments must be process or job IDs 

什麼想法?謝謝。

+0

你是什麼意思的「不工作」? 'kill'向進程發送SIGTERM,並且進程可以用這個信號做它想要的(它甚至可以忽略它)。如果你想終止這個過程,發送SIGKILL:'kill -9 $ pid',或者kill -KILL $ pid' –

+0

對不起,我忘記了錯誤消息: – achille

+0

./kill.all.sh:line 6:kill :PID:參數必須是進程或作業ID – achille

回答

2

的問題是,的lsof -i tcp輸出包含標題,和它的PID項目最終傳遞給kill命令(kill PID)從而引起錯誤。

要麼使用-t選項無頭輸出,或者與AWK忽略的第一行:

awk 'NR > 1 { print $2 }' 

其中NR是記錄(線)號碼。

請注意,kill只發送SIGTERM信號給進程,並且該進程可能僅僅忽略它。如果要確定終止該過程,請使用(-KILL)選項運行kill(有關信號代碼,請參閱man 7 signal)。

1

不要重新發明輪子。用於殺滅其使用TCP除了iceweasel所有過程:

kill $(lsof -c ^iceweasel -a -i tcp -t) 
+0

過度使用!:-D 你的語法不起作用,但是 lsof -c^icewease -i tcp -t | kill {}做得很好 – achille

+0

lsof -c^icewease -i tcp -t | xargs -i kill {} – achille