&
のようなものでいくつかのプロセスを開始するスクリプトを実行すると
tail -f log file1 &
tail -f log file2 &
どうすれば一度にすべてをシャットダウンできますか?
次の方法ですべてのテールコマンドを強制終了できます
killall tail
killall tail
トリックを行う必要がありますが、実行中の他のテールプロセスも閉じます。
子 pid を「記憶」します。
tail -f logfile1 &
pid1=$!
tail -f logfile2 &
pid2=$!
kill $pid1 $pid2
明らかに、実際のスクリプトでそのような即時キルを発行することはありません。おそらく、代わりに子プロセスを待ちたいと思うでしょう。しかし、これはあなたが求めたことをします
、、、 ...イディオムを使用して%1
、現在のシェルのバックグラウンドジョブを参照できます。%2
私の知る限り、すべてをキャッチするようなものはありません。ない%*
か、同等のものはありません。
しかし、あなたはショートカットすることができます
kill %1 %2 %3 %4 %5 %6 %7 %8
これにより、現在のシェルでまだ実行されている最初の8つのバックグラウンドプロセスが強制終了されます。それはであるかもしれないし、そうでないかもしれないtail
。
誰を殺すかに注意してください;-)
バックグラウンドプロセスを完全に制御できる場合、これは安全な方法かもしれません。シェルスクリプトからこれを実行したいと述べているので、tail
sが唯一のバックグラウンドプロセスである場合、これは簡単です。シェルスクリプトがサブシェルを開始することを確認してください。そうすれば、インタラクティブシェルのバックグラウンドプロセスに影響を与えることはありません。たとえば、スクリプトを次のように開始できます
#!/usr/bin/bash
スクリプトに実行許可ビットを設定し、常に名前でスクリプトを呼び出します。言い換えれば、source script_file
そのスクリプトを使用するべきではありません。
一方、開始しているプロセスのpid(プロセスID)を保存するというjimの答えは、他のプロセスを強制終了するためのはるかに安全な方法です。