Сигнал ловушки в фоновом процессе ребенка
Я не могу захватить сигнал при работе в процессе child/background.
Вот мой простой bash script:
#!/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)
Все работает так, как ожидалось, оно печатает "в ловушке" и выходит.
Теперь, если я запускаю тот же script из родительского script следующим образом:
#!/bin/bash
echo "starting the child"
./child.sh &
Затем ребенок больше не захватывает сигнал....?
После перехода на использование SIGTERM вместо SIGINT, он работает правильно...?
Ответы
Ответ 1
Маска страницы bash
в OSX (но она должна быть одинаковой в других версиях) имеет это сказать о обработке сигнала:
Нестроенные команды, выполняемые bash
, имеют обработчики сигналов, установленные на значения унаследованный оболочкой от ее родителя. Когда управление заданиями отсутствует эффект, асинхронные команды игнорируют SIGINT
и SIGQUIT
в дополнение к эти унаследованные обработчики.
и далее, под командой trap
:
Сигналы, игнорируемые при входе в оболочку, не могут в ловушке или reset.
Поскольку сценарии не используют управление заданиями по умолчанию, это означает случай, о котором вы говорите.
Ответ 2
В примечании:
Signals ignored upon entry to the shell cannot be trapped or reset.
Я заметил, что ZSH не игнорирует сигналы, посылаемые туда и обратно между родительским и дочерним процессами, но bash. Здесь я задал вопрос:
Треппинг сигнала CHLD - работает ZSH, но ksh/ bash/sh не?