我有一个进程生成 bash 命令,system()
而信号掩码已阻止所有信号。这不能轻易解决。
bash 命令最终exec
进入一个进程。所有被阻止的信号掩码都是从原始进程通过 bash 继承到最终进程的,所以最终我得到了一个对所有信号“免疫”的进程(当然除了SIGKILL
、SIGSTOP
等)。
解决方法是sigprocmask
从 bash 重置,但我找不到任何相关命令。可以做吗?
答案1
似乎没有一个纯粹的 bash 解决方案。
Ksh(ksh93 和 mksh)解锁所有信号(在 Debian wheezy 上测试),因此如果您可以使用 ksh 代替 bash,它将解决您的问题。
如果您无法更改调用 bash 的事实,您也许可以让 bash 执行 ksh 并让 ksh 执行子进程:replace
bash -c '…; exec child_process'
经过
bash -c '…; exec ksh -c "exec child_process"'
注意引用问题!
Ksh 快速且易于使用,但通常不是默认安装的一部分。如果这是一个问题,您可以使用 Perl,它是大多数非嵌入式 Linux 系统中默认安装的一部分。
perl -e '
use POSIX;
$s = POSIX::SigSet->new(); $s->fillset();
sigprocmask(1, $s, $s) or die $!; # 1 = SIG_UNBLOCK
exec "child_process"'
答案2
coreutils >= v8.31 中的 env 将具有此功能
env --default-signal your_prog