출력을 리디렉션할 때 "ping"이 요약을 출력하지 않는 이유는 무엇입니까?

출력을 리디렉션할 때 "ping"이 요약을 출력하지 않는 이유는 무엇입니까?

핑할 수 있어구글 사이트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이 경우 파이프라인( pingtee)의 모든 프로세스입니다. 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남성 티셔츠:

   -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종료됩니다(지금까지 입력을 "요약"한 후).

관련 정보