以下のステートメントを適切bash
に終了できない理由を誰か教えてください。Ctrl+c
$( { ( tail -fn0 /tmp/a.txt & )| while read line; do echo $line; done } 3>&1 )
このステートメントを実行すると、2 つのbash
プロセスと 1 つのtail
プロセスが開始され (get from ps auxf
)、次に入力Ctrl+cされ、プロンプトが終了しませんbash
。この時点で、2 つのプロセスがまだ実行されているbash
間に 2 つのプロセスが停止していることがわかります。tail
に何かを入力する/tmp/a.txt
と、bash プロンプトに入ることができます。
私が欲しいのは、入力してから、関連するプロセスを残さずにプロンプトをCtrl+c終了することです。bash
誰かがこのステートメントの正確なプロセスを説明してくれると、よりありがたいでしょう。たとえば、パイプが bash フォークを引き起こしたり、何かがどこかにリダイレクトされたりするなどです。
2014 年 10 月 9 日更新:
役に立つ場合に備えて、ここでいくつかの更新を提供します。私の導入ソリューションは、次の 2 つの要素で似ています。
tmp pid ファイルを使用する
( tail -Fn0 ${monitor_file} & echo "$!" >${tail_pid} ) | \ while IFS= read -r line; do xxxx done
trap like:
trap "rm ${tail_pid} 2>/dev/null; kill 0 2>/dev/null; exit;" INT TERM
を使用して、関連するプロセスを強制終了し、残りのファイルを削除します。
kill 0 2
これは bash 固有であり、0 は現在のプロセス グループ内のすべてのプロセスを意味することに注意してください。このソリューションでは tmp pid ファイルを使用しましたが、tmp pid ファイルを使用しない他のソリューションも期待しています。