Как отправить сигналу SIGINT от сценария до сценария?

Я хочу захватить сигнал, отправляют от Сценария-A.sh до Сценария-B.sh так в Сценарии-A.sh, я использую команду:

(Отправьте SIGINT в сценарий-B.sh),
уничтожьте-2$PID_Script-B.sh

И в Сценарии-B.sh я ловлю сигнал и вызываю Чистую функцию

захватите 'Убирают' 2

Это не работает, вместо этого Сценарий-B.sh уничтожается сразу же, не выполняя Чистое!!

Что я замечаю, также то, что, если я хочу отправить SIGINT от терминала до какого-либо сценария, который захватывает его, a ctrl-c будет пойман правильно, но не, если я укажу сигнал через команду kill -2 $pid_of_script

Любая идея о различии между двумя методами для отправки SIGINT (ctrl-c VS kill -2 $pid_of_script), и как я могу отправить SIGINT от сценария до другого?

13
задан codeforester 9 August 2019 в 01:38
поделиться

1 ответ

Мне удалось воспроизвести поведение, о котором вы сообщаете. Моя гипотеза состоит в том, что, поскольку сценарий запускается из неинтерактивной оболочки (как дочерний по отношению к сценарию), то SIGINT , который является сигналом клавиатуры, игнорируется.

Из info bash :

Фоновые процессы - это те, чей идентификатор группы процессов отличается от идентификатора терминала ; такие процессы невосприимчивы к сигналам клавиатуры.

Я обнаружил, что если вы перехватываете и убиваете с помощью другого сигнала, такого как SIGUSR1 , это работает.

Дополнительная информация из man bash :

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

и

Если bash ожидает завершения команды и получает сигнал, для которого установлено прерывание, прерывание не будет выполнено, пока команда не завершится.

и

] Любая ловушка на SIGCHLD выполняется для каждого выходящего потомка.

13
ответ дан 2 December 2019 в 00:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: