8

&のようなものでいくつかのプロセスを開始するスクリプトを実行すると

tail -f log file1 &
tail -f log file2 &

どうすれば一度にすべてをシャットダウンできますか?

4

4 に答える 4

11

次の方法ですべてのテールコマンドを強制終了できます killall tail

于 2013-03-06T16:20:55.637 に答える
5

killall tailトリックを行う必要がありますが、実行中の他のテールプロセスも閉じます。

于 2013-03-06T16:20:24.093 に答える
4

子 pid を「記憶」します。

tail -f logfile1 & 
pid1=$!

tail -f logfile2 &
pid2=$!

kill $pid1 $pid2

明らかに、実際のスクリプトでそのような即時キルを発行することはありません。おそらく、代わりに子プロセスを待ちたいと思うでしょう。しかし、これはあなたが求めたことをします

于 2013-03-06T16:22:08.837 に答える
3

、、、 ...イディオムを使用して%1、現在のシェルのバックグラウンドジョブを参照できます。%2

私の知る限り、すべてをキャッチするようなものはありません。ない%*か、同等のものはありません。

しかし、あなたはショートカットすることができます

kill %1 %2 %3 %4 %5 %6 %7 %8

これにより、現在のシェルでまだ実行されている最初の8つのバックグラウンドプロセスが強制終了されます。それはであるかもしれないし、そうでないかもしれないtail

誰を殺すかに注意してください;-)

バックグラウンドプロセスを完全に制御できる場合、これは安全な方法かもしれません。シェルスクリプトからこれを実行したいと述べているので、tailsが唯一のバックグラウンドプロセスである場合、これは簡単です。シェルスクリプトがサブシェルを開始することを確認してください。そうすれば、インタラクティブシェルのバックグラウンドプロセスに影響を与えることはありません。たとえば、スクリプトを次のように開始できます

#!/usr/bin/bash

スクリプトに実行許可ビットを設定し、常に名前でスクリプトを呼び出します。言い換えれば、source script_fileそのスクリプトを使用するべきではありません。

一方、開始しているプロセスのpid(プロセスID)を保存するというjimの答えは、他のプロセスを強制終了するためのはるかに安全な方法です。

于 2013-03-06T16:25:53.577 に答える