SIGQUIT ломает трубу

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 + \ и сразу получил статистику ,

Но все по-другому, когда я пытаюсь использовать ping с pipe. Команда:

ping -O 8.8.8.8 | while read pong; do echo "$(date): $pong"; done

На этот раз отправка SIGQUIT ( Ctrl + \ ) разрывает канал:

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)

Может кто-нибудь сказать, в чем причина такого поведения?

1
задан 31 July 2019 в 09:53

1 ответ

Поведение по умолчанию при отправке a SIGQUIT должен сделать процесс к:

  1. Создайте дамп ядра
  2. Оконечный

Однако 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)
2
ответ дан 7 December 2019 в 13:15

Другие вопросы по тегам:

Похожие вопросы: