15

我想捕获从 Script-A.sh 发送到 Script-B.sh 的信号,所以在 Script-A.sh 中我使用以下命令:

(向 Script-B.sh 发送 SIGINT)
kill -2 $PID_Script-B.sh

在 Script-B.sh 我捕捉到信号并调用函数 Clean

陷阱“清洁”2

它不起作用,而是立即杀死 Script-B.sh 而不执行 Clean !!

我还注意到,如果我想将 SIGINT 从终端发送到任何捕获它的脚本,actrl-c将被正确捕获,但如果我通过命令指定信号则不会kill -2 $pid_of_script

ctrl-c关于发送 SIGINT ( VS )的两种方法之间的区别kill -2 $pid_of_script以及如何将 SIGINT 从脚本发送到另一个的任何想法?

4

2 回答 2

14

我能够重现您报告的行为。我的假设是,由于脚本是非交互式外壳(作为脚本的子级)运行的SIGINT,因此键盘信号被忽略。

来自info bash

后台进程是那些进程组 ID 与终端不同的进程;这样的过程不受键盘生成的信号的影响。

我发现如果你使用另一个信号trapkill比如SIGUSR1它可以工作。

附加信息来自man bash

bash 运行的非内置命令将信号处理程序设置为 shell 从其父级继承的值。当作业控制无效时,除了这些继承的处理程序之外,异步命令还会忽略 SIGINT 和 SIGQUIT。

如果 bash 正在等待命令完成并接收到已设置陷阱的信号,则在命令完成之前不会执行陷阱。

SIGCHLD 上的任何陷阱都会针对每个退出的子节点执行。

于 2010-03-26T22:47:44.863 回答
0

在脚本 A 中:陷阱函数将如下所示,它将调用 scriptA.sh 中的 trap_mesg() 函数。KILL 信号(2/INTerrupt,5/TERMinate-默认)。你所要做的就是在从 scriptA.sh 调用 scriptB.sh 后获取正在运行的 scriptB.sh 进程/会话的 PID(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
##################################

这样,您不必将 scriptA.sh 中的 scriptB.sh 作为“.scriptB.sh ....”进行源/调用

于 2013-06-18T19:06:31.967 回答