2

セッションの例:

- cat myscript.sh 
#!/bin/bash
tail -f example.log | grep "foobar" &
echo "code goes here"
# here is were I want tail and grep to die
echo "more code here"

- ./myscript.sh

- ps
  PID TTY          TIME CMD
15707 pts/8    00:00:00 bash
20700 pts/8    00:00:00 tail
20701 pts/8    00:00:00 grep
21307 pts/8    00:00:00 ps

ご覧のとおり、tail と grep はまだ実行中です。


次のようなものは素晴らしいでしょう

#!/bin/bash
tail -f example.log | grep "foobar" &
PID=$!
echo "code goes here"
kill $PID
echo "more code here"

しかし、それはテールではなくgrepを殺すだけです。

4

2 に答える 2

4

パイプライン全体はバックグラウンドで実行されますが、grepプロセスの PID のみが に格納され$!ます。kill代わりに、ジョブ全体を強制終了するように指示します。を使用できます%1。これにより、現在のシェルによって開始された最初のジョブが強制終了されます。

#!/bin/bash
tail -f example.log | grep "foobar" &
echo "code goes here"
kill %1
echo "more code here"

プロセスを強制終了しただけでも、終了時にそのファイルハンドルが閉じられているため、次に標準出力に書き込もうとしたときにプロセスは終了するはずgrepです。example.log が更新される頻度に応じて、すぐに更新される場合もあれば、しばらく時間がかかる場合もあります。tailgrep

于 2013-11-11T13:05:46.547 に答える
2

kill %1スクリプトの最後に追加できます。

これfirstにより、作成された背景が削除され、pid などを調べる必要がなくなります。

于 2013-11-11T13:11:16.370 に答える