Сигнал ловушки в дочернем фоновом процессе

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

Вот мой простой скрипт 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 делает. Вот вопрос, который я отправил себе:

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

Другие вопросы по тегам