Сигнал ловушки в дочернем фоновом процессе - PullRequest
13 голосов
/ 13 апреля 2011

Я не могу перехватить сигнал при запуске в дочернем / фоновом процессе.

Вот мой простой сценарий 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 ]

11 голосов
/ 13 апреля 2011

Справочная страница bash в OSX (но она должна быть такой же в других версиях) говорит об обработке сигналов:

Для не встроенных команд, запускаемых bash, обработчикам сигналов присвоены значения наследуется оболочкой от своего родителя. Когда контроль работы не в эффект, асинхронные команды игнорируют SIGINT и SIGQUIT в дополнение к эти унаследованные обработчики.

и далее под командой trap:

Сигналы, игнорируемые при входе в оболочку, не могут быть пойманным или сброшенным.

Поскольку сценарии по умолчанию не используют управление заданиями, это означает, что вы говорите.

3 голосов
/ 05 марта 2012

На заметку:

Signals ignored upon entry to the shell cannot be trapped or reset.

Я заметил, что ZSH не игнорирует сигналы, передаваемые назад и вперед между родительским и дочерним процессами, но bash делает.Вот вопрос, который я отправил себе:

Перехват сигнала CHLD - ZSH работает, но ksh / bash / sh нет?

...