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