Почему ping выводится после того, как он был прерван?

Не уверен, что полностью понял вопросы, но думаю, это то, что вы ищете.

пример

[root@HomeTraining ~]$ cat example 
#!/bin/bash
VAR1=$1
echo "$VAR1"

Где $1 — первый аргумент вашей команды.

[root@HomeTraining ~]$. example New_Text
New_Text

Я думаю, вы можете сделать столько, сколько захотите.

#!/bin/bash
VAR1=$1
VAR2=$2
echo "$VAR1 $VAR2"

$. example one two
one two
14
11.11.2020, 11:52
2 ответа

Ctrl + C заставляет терминал отправлять SIGINT группе процессов переднего плана. Процесс, получивший SIGINT, может делать что угодно, даже игнорировать сигнал. Обычной реакцией на SIGINT является изящный выход, т. е. после очистки и т. д.

Ваш pingпросто предназначен для печати статистики после SIGINT и последующего выхода.

Другие инструменты могут вообще не завершать работу после SIGINT. Например. обычное поведение интерактивной оболочки (, когда не выполняется команда ), заключается в очистке ее командной строки и перерисовке подсказки.

SIGINT — не единственный сигнал, предназначенный для завершения команд. См. руководство (man 7 signal), там есть много сигналов, действие которых по умолчанию — завершение процесса. killпо умолчанию отправляет SIGTERM. SIGTERM — это не SIGINT. Оба можно игнорировать. SIGKILL нельзя перехватить, заблокировать или проигнорировать , но это должен быть ваш последний выбор.

49
18.03.2021, 22:51

В дополнение к принятому ответу -здесь пинг выполняется в одном сеансе, а в другом я запускал разные команды уничтожения.

server~ $ ping google.com
PING google.com (172.217.5.110) 56(84) bytes of data.
64 bytes from google.com(172.217.5.110): icmp_seq=1 ttl=111 time=1.68 ms
64 bytes from google.com(172.217.5.110): icmp_seq=2 ttl=111 time=1.73 ms
Terminated

Выше был SIGTERM , который является сигналом 15. Код выхода был 143.

server ~ $ ping google.com
PING google.com (172.217.5.110) 56(84) bytes of data.
64 bytes from google.com(172.217.5.110): icmp_seq=1 ttl=111 time=1.71 ms
64 bytes from google.com(172.217.5.110): icmp_seq=2 ttl=111 time=1.71 ms
Killed

Это был SIGKILL , который является сигналом 9. Визуально он выглядит так же, но с другим текстом, и на этот раз код выхода 137.

server~ $ ping google.com
PING google.com (172.217.5.110) 56(84) bytes of data.
64 bytes from google.com(172.217.5.110): icmp_seq=1 ttl=111 time=1.69 ms
64 bytes from google.com(172.217.5.110): icmp_seq=2 ttl=111 time=1.70 ms
           **signal sent here**
--- google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 1.697/1.701/1.705/0.004 ms

Это был SIGINT , который является сигналом 2. Таким образом, функционально то же самое, что и ^C. Любопытно, что код выхода равен 0, что для большинства тестов будет успешным, а не неудачным.

Результатом этого является то, что pingделает разные вещи для разных сигналов.

Вы можете увидеть исходный файл для ping по адресу https://gist.github.com/kbaribeau/4495181, который ссылается наhttps://ftp.arl.army.mil/~mike/ping.htmlкак на оригинал.

line
408     signal( SIGINT, finish );
409     signal(SIGALRM, catcher);

457     *           C A T C H E R
459     * This routine causes another PING to be transmitted, and then
460     * schedules another SIGALRM for 1 second from now.

См. полный код по ссылке.

4
18.03.2021, 22:51

Теги

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