Как отправить сигнал SIGINT из скрипта в скрипт? УДАР

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

(отправить SIGINT в Script-B.sh)
убить -2 $PID_Script-B.sh

и в Script-B.sh я ловлю сигнал и вызываю функцию Clean

ловушка 'Clean' 2

Он не работает, вместо этого Script-B.sh убивают сразу, не выполнив чистку !!

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

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

С уважением,

отладчик

2 ответов


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

С info bash:

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

Я нашел, что если вы trap и kill используя другой сигнал, такой как SIGUSR1 это работает.

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

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

и

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

и

любая ловушка на SIGCHLD выполняется для каждого дочернего элемента, который выходит.


в скрипте a: функция Trap будет выглядеть следующим образом, который вызовет функцию trap_mesg () в scriptA.sh - ... Сигнал KILL (2 / INTerrupt, 5 / TERMinate-по умолчанию). Все, что вам нужно сделать, это получить PID runing scriptB.sh процесс / сеанс один раз scriptB.sh вызывается из scriptA.sh (нохуп ... & даст вам или использовать команду ps)

trap_mesg ()
{
 #...do something here for script B..
 # i.e. 
 kill -2 PID_of_ScriptB.sh_running_process_session
 sleep 10; #just in case, not reqd though.
 #show using ps -eAf|grep "scriptB" ... if null means, scriptB is gone. user is happy now.
 #...before actually exiting out...
 #show script A is exiting out as ScriptB is dead already, time for scriptA now.
 #...do something here..
}

#####################################
## Trap signals : INT, TERM. catch ##
#####################################
#Set NULL/Blank value to trap_call. This variable will help in running trap_mesg only once during the life of this script.
trap_call="";

trap 'if [ -z ${trap_call} ]; then trap_call="1"; trap_mesg ; fi' 2 15
##################################




Теперь, в scriptB.sh выполните такие же или аналогичные, но только на scriptB ловушка работы (как вызов чистый.)

clean ()
{
echo "karoge seva to milega meva"; 
rm -fr /some/folder_file
}

trap_mesg ()
{
 #...do something here JUST for script B trap message work..
 # i.e. 
 clean;
 #...do something here..
}

#####################################
## Trap signals : INT, TERM. catch ##
#####################################
#Set NULL/Blank value to trap_call. This variable will help in running trap_mesg only once during the life of this script.
trap_call="";

trap 'if [ -z ${trap_call} ]; then trap_call="1"; trap_mesg ; fi' 2 15
##################################

таким образом, вам не нужно источник / вызов scriptB.sh внутри scriptA.sh как ". scriptB.sh ...."