Bash에서 sigprocmask 호출

Bash에서 sigprocmask 호출

bash 명령을 생성하는 프로세스가 있고 system()신호 마스크가 모든 신호를 차단했습니다. 이는 쉽게 해결될 수 없습니다.

bash 명령은 결국 exec프로세스에 들어갑니다. 차단된 모든 신호 마스크는 bash를 통해 원래 프로세스에서 최종 프로세스로 상속되므로 결국 모든 신호에 "면역"되는 프로세스가 됩니다(물론 등은 제외 SIGKILL) SIGSTOP.

해결책은 sigprocmaskbash에서 재설정하는 것이지만 관련 명령을 찾을 수 없습니다. 할 수 있나요?

답변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

관련 정보