1

以下のステートメントを適切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 つの要素で似ています。

  1. tmp pid ファイルを使用する

    ( tail -Fn0 ${monitor_file} & echo "$!" >${tail_pid} ) | \
    while IFS= read -r line; do 
        xxxx
    done 
    
  2. 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 ファイルを使用しない他のソリューションも期待しています。

4

1 に答える 1

1

INTシグナル (によって送信されたCtrl-C)をトラップして、tailプロセスを強制終了するように機能します。

$( r=$RANDOM; trap '{ kill $(cat /tmp/pid$r.pid);rm /tmp/pid$r.pid;exit; }' SIGINT EXIT; { ( tail -fn0 /tmp/a.txt & echo $! > /tmp/pid$r.pid  )| while read line; do echo $line; done } 3>&1 )

(少なくともほとんどの場合、複数のインスタンスを実行できるようにするために、PID ファイル名にランダムな値を使用します)

于 2014-01-02T08:29:23.437 に答える