将信号捕获到进程组

时间:2013-02-07 12:43:25

标签: linux bash

有没有办法捕获发送到进程组的信号,以便任何子进程都不会受到信号的影响?

我的问题是我有一个应用程序在SIGTERM上很好地终止但在SIGUSR1上打破了干净,所以我想保护它不受SIGUSR1的影响。我想过编写一个简单的bash脚本:

#!/bin/bash

runapp &
childspid=$!

trap "kill -TERM $childspid ; exit" USR1

while true ; do
    sleep 10 ;
done

不幸的是,杀手狡猾并将SIGUSR1发送给整个流程组而不仅仅是领导者。

非常感谢,

3 个答案:

答案 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