Как отправить сигнал 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 ...."