如何从脚本向脚本发送信号SIGINT? BASH

时间:2010-03-26 16:32:57

标签: bash signals copy-paste kill bash-trap

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

  

(将SIGINT发送到Script-B.sh)
  杀-2 $ PID_Script-B.sh

在Script-B.sh中,我捕获信号并调用函数Clean

  陷阱'干净'2

它不起作用,而是在没有执行Clean的情况下立即杀死Script-B.sh!

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

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

此致

调试器

2 个答案:

答案 0 :(得分:13)

我能够重现您举报的行为。我的假设是,因为脚本正在运行 来自 一个非交互式shell(作为脚本的子代)SIGINT,这是一个键盘信号,被忽略了。

来自info bash

  

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

我发现,如果trapkill使用SIGUSR1之类的其他信号,则可以正常工作。

来自man bash的其他信息:

  

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

  

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

  

对每个退出的孩子执行SIGCHLD上的任何陷阱。

答案 1 :(得分:0)

在脚本A中:Trap函数将如下所示,它将调用scriptA.sh中的trap_mesg()函数。 KILL信号(2 / INTerrupt,5 / TERMinate-default)。所有,您需要做的是从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 ....”来源/调用。