Сигнал ловушки в дочернем фоновом процессе
Я не могу перехватить сигнал при запуске в дочернем / фоновом процессе.
Вот мой простой скрипт bash:
#!/bin/bash
echo "in child"
trap "got_signal" SIGINT
function got_signal {
echo "trapped"
exit 0
}
while [ true ]; do
sleep 2
done
При запуске этого и позже сделайте
kill -SIGINT (pid)
Все работает как положено, печатает "в ловушке" и выходит.
Теперь, если я запускаю тот же сценарий из родительского сценария, как это:
#!/bin/bash
echo "starting the child"
./child.sh &
Тогда ребенок больше не ловит сигнал....?
После перехода на использование SIGTERM вместо SIGINT, похоже, он работает правильно...?
2 ответа
bash
man-страница в OSX (но она должна быть такой же в других версиях) может сказать об обработке сигналов:
Не встроенные команды, запускаемые
bash
иметь в качестве обработчиков сигналов значения, унаследованные оболочкой от ее родителя. Когда управление заданиями не действует, асинхронные команды игнорируютсяSIGINT
а такжеSIGQUIT
в дополнение к этим унаследованным обработчикам.
и далее, под trap
команда:
Сигналы, игнорируемые при входе в оболочку, не могут быть перехвачены или сброшены.
Поскольку сценарии не используют управление заданиями по умолчанию, это означает, что вы говорите.
В соответствии с вашей запиской:
Signals ignored upon entry to the shell cannot be trapped or reset.
Я заметил, что ZSH не игнорирует сигналы, передаваемые назад и вперед между родительским и дочерним процессами, но bash делает. Вот вопрос, который я отправил себе: