Подтвердить что ты не робот

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

Я не могу захватить сигнал при работе в процессе 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, он работает правильно...?

4b9b3361

Ответ 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 не?