出力をリダイレクトするときに「ping」が要約を出力しないのはなぜですか?

出力をリダイレクトするときに「ping」が要約を出力しないのはなぜですか?

言うことができますGoogleサイトCtrl数秒間+を押すと、C下部に短い要約が表示されます。

$ ping google.com
PING google.com (74.125.131.113) 56(84) bytes of data.
64 bytes from lu-in-f113.1e100.net (74.125.131.113): icmp_seq=2 ttl=56 time=46.7 ms
64 bytes from lu-in-f113.1e100.net (74.125.131.113): icmp_seq=3 ttl=56 time=45.0 ms
64 bytes from lu-in-f113.1e100.net (74.125.131.113): icmp_seq=4 ttl=56 time=54.5 ms
^C
--- google.com ping statistics ---
4 packets transmitted, 3 received, 25% packet loss, time 3009ms
rtt min/avg/max/mdev = 44.965/48.719/54.524/4.163 ms

ただし、同じリダイレクト出力をログファイルとして実行すると、tee要約は表示されません。

$ ping google.com | tee log
PING google.com (74.125.131.113) 56(84) bytes of data.
64 bytes from lu-in-f113.1e100.net (74.125.131.113): icmp_seq=1 ttl=56 time=34.1 ms
64 bytes from lu-in-f113.1e100.net (74.125.131.113): icmp_seq=2 ttl=56 time=57.0 ms
64 bytes from lu-in-f113.1e100.net (74.125.131.113): icmp_seq=3 ttl=57 time=50.9 ms
^C

リダイレクトされた出力を使用すると、要約も取得できますかtee

答え1

ping死亡時の要約SIGINT表示例えばその結果、CtrlCまたは要求された数のパケットを送信したとき(-cオプション)。フォアグラウンドプロセスグループ内のすべてのプロセスにメッセージが送信されるようにCtrlCします。SIGINTつまりこれはパイプライン(pingおよびtee)のすべてのプロセスです。teeキャプチャしないのでSIGINT(Linuxでは参照SigCgt/proc/$(pgrep tee)/status、信号を受信するとパイプの端が閉じて終了します。次に起こるのは競争です。それでも出力している場合は、出力を取得するping前に死んでください。何も出力する前に取得したら、要約を出力してdieを試してください。とにかく出力はもう行くところがありません。SIGPIPESIGINTSIGINTSIGPIPE

要約を取得するには、ping次のコマンドを使用して出口をスケジュールしますSIGINT

killall -INT ping

または、所定の数のパケットで実行します。

ping -c 20 google.com | tee log

または(最後のために最善を尽くして保存)、tee無駄があるSIGINT、発見したように。

答え2

tee+を押すと送信される割り込み信号を無視するオプションがあることがわかりました。 ~からCTRLCメンズTシャツ:

   -i, --ignore-interrupts
          ignore interrupt signals

パイプライン全体が中断されると、SIGINTこの信号はパイプライン内のすべてのプロセスに送信されます。問題は通常、最初に受け取ってteeから殺すことです。省略すると、要約としてのみ渡され、表示されます。SIGINTpingpingSIGPIPESIGINTteeping

$ ping google.com | tee --ignore-interrupts log 
PING google.com (142.250.150.101) 56(84) bytes of data.
64 bytes from la-in-f101.1e100.net (142.250.150.101): icmp_seq=1 ttl=104 time=48.8 ms
64 bytes from la-in-f101.1e100.net (142.250.150.101): icmp_seq=2 ttl=104 time=51.0 ms
64 bytes from la-in-f101.1e100.net (142.250.150.101): icmp_seq=3 ttl=107 time=32.2 ms
^C
--- google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 32.198/44.005/50.973/8.394 ms

したがって、ping受信はSIGINT最終的に終了し、teeパイプビルダーが終了したことを確認して最終的にtee終了します(これまで入力を「要約」した後)。

関連情報