gpt4 book ai didi

linux - 将信号捕获到进程组

转载 作者:IT王子 更新时间:2023-10-29 00:36:10 25 4
gpt4 key购买 nike

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

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

#!/bin/bash

runapp &
childspid=$!

trap "kill -TERM $childspid ; exit" USR1

while true ; do
sleep 10 ;
done

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

非常感谢,

最佳答案

您可以通过一点点 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:~$

关于linux - 将信号捕获到进程组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14751430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com