現在実行中のコマンドによってトリガーされたインスタンスを除いて、実行中のプロセスインスタンスを終了します。

現在実行中のコマンドによってトリガーされたインスタンスを除いて、実行中のプロセスインスタンスを終了します。

シェルスクリプトを使用して実行中のすべての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

関連情報