シェルスクリプトを使用して実行中のすべてのXvfbインスタンスを終了する必要があるため、次のコードがあります。
for pid in $(ps -ef | awk '/Xvfb/ {print $2}'); do kill -9 $pid; done
すべてのインスタンスが終了しますが、次のエラーが原因で1つは失敗します。
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