シェルスクリプトを使用して実行中の 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" が含まれていることです。パイプの両方のプロセスが同時に実行されるため、呼び出し自体も の出力に登録されます(コマンドラインに と入力するとどうなるか試してみてください)。awk
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