将信号捕获到进程组

有什么办法来捕获发送到进程组的信号,以便任何subprocess不会受到信号的攻击?

我的问题是,我有一个很好地结束SIGTERM的应用程序,但在SIGUSR1上不干净,所以我想保护它免受SIGUSR1。 我想写一个简单的bash脚本:

#!/bin/bash runapp & childspid=$! trap "kill -TERM $childspid ; exit" USR1 while true ; do sleep 10 ; done 

不幸的是,这个杀手狡猾,把SIGUSR1发送给整个过程组,而不仅仅是领导。

非常感谢,

您可以通过利用一点点perl在任何应用程序上设置SIGIGN处置:

 perl -e '$SIG{"USR1"} = "IGNORE"; exec(@ARGV)' realprogram realargs... 

只要realprogram不修改信号,那么它是安全的。

这个工作的原因是信号掩码被子进程自动继承,无论它们是由fork(), exec()还是在它自己的exec()上启动。

注意:我曾尝试过使用bash buildins,但是信号处理程序在子程序被执行(GAH!)之前被恢复,这不是我想要的。

无面膜:

 natsu:~$ grep SigIgn /proc/$$/status SigIgn: 0000000000384004 

添加掩码:

 natsu:~$ trap '' USR1 natsu:~$ grep SigIgn /proc/$$/status SigIgn: 0000000000384204 

子过程失去面膜:(

 natsu:~$ bash natsu:~$ grep SigIgn /proc/$$/status SigIgn: 0000000000384004 natsu:~$ kill -USR1 $$ User defined signal 1 

现在用Perl:

 natsu:~$ perl -e '$SIG{"USR1"} = "IGNORE"; exec(@_)' bash natsu:~$ grep SigIgn /proc/$$/status SigIgn: 0000000000384204 natsu:~$ kill -USR1 $$ natsu:~$ 

只要写SIGUSR1信号的捕获信号的自己的信号处理程序,不采取任何行动。

为防止runapp被狡诈杀手发送SIGUSR1,可以通过监视模式在单独的进程组中运行它。

 #!/bin/bash set -m runapp& trap "kill $!; exit" USR1 wait