У меня есть следующий скрипт:
#!/bin/bash
echo "We are $$"
trap "echo HUP" SIGHUP
cat # wait indefinitely
Когда я отправляю SIGHUP
(использую kill -HUP pid
) ничего не происходит.
Если я немного изменю сценарий:
#!/bin/bash
echo "We are $$"
trap "kill -- -$BASHPID" EXIT # add this
trap "echo HUP" SIGHUP
cat # wait indefinitely
... тогда скрипт работает echo HUP
правильно при выходе (когда я нажимаю Ctrl + C):
roger@roger-pc:~ $ ./hupper.sh
We are 6233
^CHUP
Что происходит? Как я должен отправить сигнал (это не обязательно должно быть SIGHUP
) к этому сценарию?
cat
процесс завершится . Попробуйте свой оригинальный сценарий и нажмите,Ctrl+D
чтобы завершитьcat
процесс. Покаcat
процесс находится на переднем плане, наHUP
сигнал не воздействуют. Попробуйте еще раз сcat
заменой наread
(встроенная оболочка).while true; do read; done
в конце, иначе ввод текста заставляет его также выйти, и я хочу выйти из него по Ctrl + C.Ответы:
Руководство Bash гласит:
Это означает, что, несмотря на то, что сигнал получен
bash
при его отправке, ваша ловушка на SIGHUP будет вызываться только поcat
окончании.Если это поведение нежелательно, то либо используйте
bash
встроенные функции (например,read
+printf
в цикле вместоcat
), либо используйте фоновые задания (см . Ответ Стефана ).источник
@xhienne уже объяснил почему , но если вы хотите, чтобы сигнал действовал сразу (а не выходил из сценария), вы можете изменить свой код на:
Небольшой танец с файловыми дескрипторами - обойти тот факт, что
bash
перенаправляет стандартный ввод/dev/null
для команд, запускаемых в фоновом режиме.источник