有没有办法捕获发送到进程组的信号,以便任何子进程都不会受到信号的影响?
我的问题是我有一个应用程序在SIGTERM上很好地终止但在SIGUSR1上打破了干净,所以我想保护它不受SIGUSR1的影响。我想过编写一个简单的bash脚本:
#!/bin/bash
runapp &
childspid=$!
trap "kill -TERM $childspid ; exit" USR1
while true ; do
sleep 10 ;
done
不幸的是,杀手狡猾并将SIGUSR1发送给整个流程组而不仅仅是领导者。
非常感谢,
答案 0 :(得分:3)
您可以通过利用一点点perl来设置任何app上的SIGIGN处置:
perl -e '$SIG{"USR1"} = "IGNORE"; exec(@ARGV)' realprogram realargs...
只要真正的程序不修改信号,就可以保证信号安全。
这样做的原因是信号掩码会自动由子进程继承,无论它们是由fork(), exec()
启动还是仅由exec()
启动。
注意:我曾尝试过使用bash内置函数,但是在执行子进程之前恢复了信号处理程序(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:~$
答案 1 :(得分:0)
只需为SIGUSR1信号编写自己的信号处理程序,该信号捕获信号并且不采取任何操作。
答案 2 :(得分:0)
为防止狡猾杀手发送runapp
SIGUSR1,您可以通过监控模式在单独的进程组中运行它。
#!/bin/bash
set -m
runapp&
trap "kill $!; exit" USR1
wait