Linux ping может генерировать некоторую статистику по получению SIGQUIT
без прерывания. Это выглядит так:
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=45 time=37.8 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=45 time=36.3 ms
2/2 packets, 0% loss, min/avg/ewma/max = 36.399/37.126/37.672/37.854 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=45 time=36.2 ms
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 36.294/36.849/37.854/0.711 ms
Как вы можете видеть, я отправил SIGQUIT
сразу после второго запроса, нажав Ctrl kbd> + \ kbd> и сразу получил статистику ,
Но все по-другому, когда я пытаюсь использовать ping с pipe. Команда:
ping -O 8.8.8.8 | while read pong; do echo "$(date): $pong"; done
На этот раз отправка SIGQUIT
( Ctrl kbd> + \ kbd>) разрывает канал:
Tue Jul 30 18:15:20 EEST 2019: PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
Tue Jul 30 18:15:20 EEST 2019: 64 bytes from 8.8.8.8: icmp_seq=1 ttl=45 time=71.1 ms
Tue Jul 30 18:15:21 EEST 2019: 64 bytes from 8.8.8.8: icmp_seq=2 ttl=45 time=51.4 ms
Tue Jul 30 18:15:22 EEST 2019: 64 bytes from 8.8.8.8: icmp_seq=3 ttl=45 time=54.5 ms
Tue Jul 30 18:15:23 EEST 2019: 64 bytes from 8.8.8.8: icmp_seq=4 ttl=45 time=56.5 ms
Tue Jul 30 18:15:24 EEST 2019: 64 bytes from 8.8.8.8: icmp_seq=5 ttl=45 time=56.5 ms
Tue Jul 30 18:15:25 EEST 2019: 64 bytes from 8.8.8.8: icmp_seq=6 ttl=45 time=60.1 ms
6/6 packets, 0% loss, min/avg/ewma/max = 51.421/58.394/63.927/71.104 ms
Quit (core dumped)
Может кто-нибудь сказать, в чем причина такого поведения?
Поведение по умолчанию при отправке a SIGQUIT
должен сделать процесс к:
Однако SIGQUIT
может быть обработан и проигнорирован, Который ping
делает это! таким образом SIGQUIT
причины ping
распечатать короткую статистику без завершения фактического процесса.
Используя Ctrl +\Вы отправляют SIGQUIT
обеим сторонам Ваших команд. Вторая часть не обрабатывает сигнал и ведет себя как ожидалось! создает coredump, затем завершается, и Вы заканчиваете с поврежденным каналом.
Так, необходимо обработать сигнал сами:
ping 1.1.1.1 | (oq() { echo 'wait'; }; trap oq QUIT; while read i; do echo $i; done)