殺死正在運行的進程實例,但由於目前執行的命令而觸發的實例除外

殺死正在運行的進程實例,但由於目前執行的命令而觸發的實例除外

我必須使用 shell 腳本殺死所有正在運行的 Xvfb 實例,因此有以下程式碼 -

for pid in $(ps -ef | awk '/Xvfb/ {print $2}'); do kill -9 $pid; done

它會殺死所有實例,但有一個實例失敗並出現以下錯誤 -

kill: (142898) - No such process

上面執行的命令似乎又創建了一個實例,但在殺死時該實例不再存在。在這種情況下,我怎麼能跳過它並成功使用腳本?

答案1

問題是您將 的輸出透過管道傳輸ps到查找字串「Xvfb」的呼叫中awk,因此在其自己的命令列中也包含字串「Xvfb」。因為管道的兩個進程是同時執行的,所以awk呼叫本身也將在輸出中註冊(試試看如果您只是在命令列上ps鍵入會發生什麼)。ps -ef | awk '/Xvfb/'

然而,當循環啟動時(當命令替換$( … )awk進程也退出時發生),該awk進程不再存在,因此kill偶然發現了這一點。

如果將命令替換中的命令修改為

ps -ef | awk '$0 ~ /Xvfb/ && index($0,"awk")==0 {print $2}'

這將確保awk清單中不包含包含子字串的命令。

答案2

您正試圖殺死awk.

避免這種情況的一個簡單的正規表示式技巧是使用某種轉義。例如wor[d]

所以對於你的程式碼(加入了變數引用)

for pid in $(ps -ef | awk '/Xvf[b]/ {print $2}'); do kill -9 "$pid"; done

相關內容