4

ソケットの読み取りループ内で SIGINT ctrl+c をキャッチしようとしましたが、要求しているブレークは新しい行の後にのみ処理されます。そのため、実行中のアプリを ctrl+c すると、新しい行がソケットに到着するのを待たなければループが中断されず、アプリが終了しません。

これは最小バージョンです:

trap "break" SIGINT SIGHUP SIGTERM
exec 3<>/dev/tcp/192.168.1.84/50885

while read line  
do   
   echo -e "$line\n" 
done <&3

ループをすぐに中断してアプリを終了するにはどうすればよいですか?

4

1 に答える 1

3

Abreakは、いつでもどこでも実行できる実際のコマンドではありません。周囲のループを終了するポイントをマークするのは、単なる構文構造です。あなたbreakには周囲のループがないため、意味がありません(そしてエラーです: bash: break: only meaningful in a `for', `while', or `until' loop)。

read代わりにコマンドを強制終了する必要があります:

trap "killRead" SIGINT SIGHUP SIGTERM

killRead() {
  kill $(cat /tmp/read.pid)
}

exec 3<>/dev/tcp/192.168.1.84/50885

while read line  
do   
   echo -e "$line\n" 
done <&3 & pid=$!

echo $pid > /tmp/read.pid

wait $pid

もちろん、これは非常に大まかな解決策にすぎず、終了したサブシェルなどによって発行されたエラーメッセージを非表示にすることはありません。しかし、それはアイデアを示し、あなたが尋ねた問題を解決します。予期されるエラー メッセージなどを非表示にするために、他の質問をしたい場合があります (または、ここで既に与えられた回答を検索してください ;-)

于 2014-07-30T09:17:49.260 に答える