Вопрос

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

(Отправить сообщение по адресу Script-B.sh)
убить -2 $PID_Script-B.sh

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

ловушка "Чистая" 2

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

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

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

Это было полезно?

Решение

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

От info bash:

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

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

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

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

и

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

и

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

Другие советы

В сценарии A:Функция Trap будет выглядеть следующим образом, которая вызовет функцию trap_mesg() в scriptA.sh.Сигнал ЗАВЕРШЕНИЯ (2 / прерывание, 5/Завершение - по умолчанию).Все, что вам нужно сделать, это получить PID запущенного scriptB.sh процесса / сеанса один раз scriptB.sh вызывается из scriptA.sh (nohup ...& даст вам или использует команду 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).

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 ...."

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top