5

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

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

#!/bin/bash

runapp &
childspid=$!

trap "kill -TERM $childspid ; exit" USR1

while true ; do
    sleep 10 ;
done

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

非常感谢,

4

3 回答 3

3

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

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

只要 realprogram 不修改信号,它就不会受到它们的影响。

这样做的原因是信号掩码由子进程自动继承,无论它们是由它自己启动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:~$
于 2013-10-17T15:26:54.217 回答
0

只需为 SIGUSR1 信号编写自己的信号处理程序,它会捕获信号并且不采取任何行动。

于 2013-02-08T04:43:59.913 回答
0

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

#!/bin/bash
set -m
runapp&
trap "kill $!; exit" USR1
wait
于 2013-10-17T12:57:28.717 回答