我必須使用 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