Я хочу захватить сигнал, отправляют от Сценария-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 от сценария до другого?
Мне удалось воспроизвести поведение, о котором вы сообщаете. Моя гипотеза состоит в том, что, поскольку сценарий запускается из неинтерактивной оболочки (как дочерний по отношению к сценарию), то SIGINT
, который является сигналом клавиатуры, игнорируется.
Из info bash
:
Фоновые процессы - это те, чей идентификатор группы процессов отличается от идентификатора терминала ; такие процессы невосприимчивы к сигналам клавиатуры.
Я обнаружил, что если вы перехватываете
и убиваете
с помощью другого сигнала, такого как SIGUSR1
, это работает.
Дополнительная информация из man bash
:
Не встроенные команды, выполняемые bash, имеют обработчики сигналов, установленные в значения, унаследованные оболочкой от своего родителя. Когда управление заданиями не действует, асинхронные команды игнорируют SIGINT и SIGQUIT в дополнение к этим унаследованным обработчикам.
и
Если bash ожидает завершения команды и получает сигнал, для которого установлено прерывание, прерывание не будет выполнено, пока команда не завершится.
и
] Любая ловушка на SIGCHLD выполняется для каждого выходящего потомка.