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

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

シェルスクリプトを使用して実行中の Xvfb インスタンスをすべて終了する必要があるため、次のコードを使用します。

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

すべてのインスタンスを強制終了しますが、1つが次のエラーで失敗します -

kill: (142898) - No such process

上記で実行されたコマンドはインスタンスをもう 1 つ作成しますが、強制終了するとそのインスタンスは存在しなくなります。この場合、それをスキップしてスクリプトを成功させるにはどうすればよいですか?

答え1

問題は、 の出力を、文字列 "Xvfb" を検索する のps呼び出しにパイプしているため、そのコマンドラインにも文字列 "Xvfb" が含まれていることです。パイプの両方のプロセスが同時に実行されるため、呼び出し自体も の出力に登録されます(コマンドラインに と入力するとどうなるか試してみてください)。awkawkpsps -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

関連情報