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

Deb*_*ger 13 bash signals kill bash-trap

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

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

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

陷阱'清洁'2

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

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

有没有想过发送SIGINT(ctrl-cVS kill -2 $pid_of_script)的两种方法之间的区别,以及如何将SIGINT从脚本发送到另一个?

问候,

调试器

Pau*_*ce. 13

我能够重现您报告的行为.我的假设是,由于脚本是非交互式shell(作为脚本的子节点)运行的SIGINT,因此忽略了键盘信号.

来自info bash:

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

我发现,如果你trapkill使用其他信号,如SIGUSR1它的工作原理.

其他信息来自man bash:

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

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

SIGCHLD上的任何陷阱都会针对退出的每个子进行执行.