bashコマンドを生成するプロセスがあり、system()
信号マスクがすべての信号をブロックしました。これは簡単に解決できません。
bashコマンドは最終的にexec
プロセスに入ります。ブロックされたすべての信号マスクはbashを介して元のプロセスから最終プロセスに継承されるため、最終的にすべての信号に「免疫」されるプロセスになります(もちろんなどは除くSIGKILL
)SIGSTOP
。
解決策はsigprocmask
bashでリセットすることですが、関連するコマンドが見つかりません。できますか?
答え1
純粋なbashソリューションがないようです。
Ksh(ksh93とmksh)はすべての信号のブロックを解除するので(Debian wheezyでテストされています)、bashの代わりにkshを使用できれば問題は解決します。
bashが呼び出されるという事実を変更できない場合は、bashにkshを実行し、kshに子プロセスを実行させることができます。
bash -c '…; exec child_process'
渡す
bash -c '…; exec ksh -c "exec child_process"'
引用の問題に注意してください!
Kshは高速で使いやすいですが、通常はデフォルトのインストールには含まれていません。これが問題であれば、ほとんどの非組み込みLinuxシステムでは、基本インストールの一部であるPerlを使用できます。
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