我想捕获从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从脚本发送到另一种方法?
此致
调试器
答案 0 :(得分:13)
我能够重现您举报的行为。我的假设是,因为脚本正在运行 来自 一个非交互式shell(作为脚本的子代)SIGINT
,这是一个键盘信号,被忽略了。
来自info bash
:
后台进程是进程组ID与进程组ID不同的进程 终端的;这些过程不受键盘生成的信号的影响。
我发现,如果trap
和kill
使用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 ....”来源/调用。