Bash에서 하위 프로세스에 대한 신호 마스크 설정

Bash에서 하위 프로세스에 대한 신호 마스크 설정

내 문제는 다음과 같습니다. 호출할 때 명령줄 인수를 추가하는 작은 래퍼 스크립트를 작성하려고 합니다. 호출자가 USR1Xorg의 신호를 기다리고 있습니다. XSERVER 매뉴얼 페이지에서:

SIGUSR1

이 신호는 위의 신호와는 완전히 다른 방식으로 사용됩니다. 서버가 시작되면 SIGUSR1이 일반적인 SIG_DFL 대신 SIG_IGN으로 상속되는지 확인합니다. 이 경우 서버는 다양한 연결 시나리오를 설정한 후 SIGUSR1을 상위 프로세스로 보냅니다. Xdm은 이 기능을 사용하여 서버에 연결할 수 있는 시기를 식별합니다.

나는 단순히 신호를 잡아서 전달할 수 있다고 생각합니다.

#!/bin/bash
parent_trap(){
   echo sending USR1 to $PPID &> /tmp/wrapper.log
   kill -USR1 $PPID
}
trap "parent_trap" USR1
Xorg $@ (extra stuff) &
wait

그러나 물론 이것은 스크립트 자체가 호출자에 의해 무시되기 때문에 작동하지 않습니다 USR1. 내가 해야 할 일은 스크립트가 신호 무시를 중지하도록 하는 것뿐 아니라 어떻게든 Xorg를 시작하고 USR1무시하도록 하는 것입니다(맨 페이지의 동작을 트리거하기 위해). .)

Bash/다른 스크립팅 언어에서 이것이 가능합니까? 몇 가지 이유로 솔루션 컴파일을 피하고 싶지만 불가능한 일은 아닙니다. 이것이 완전히 잘못되었다고 생각하는 것도 가능하며 USR1Xorg에서 발신자에게 연락하는 다른 방법이 있습니다.

답변1

새로운 스크립트

신호를 사용하여 멋진 작업을 수행하는 대신 다음을 수행하는 것이 좋습니다.

$ cat xorg_wrapper
#!/bin/bash

exec Xorg $@ (extra stuff)

어떻게 작동하나요?

exec위 내용을 설명하기 위해 위 스크립트의 메커니즘을 보여주는 데 도움이 되는 더 자세한 예가 있습니다 .

$ cat xorg.bash
#!/bin/bash

echo "script's PID: $$"
sleep 5
echo "starting fakeXorg..."
exec sleep 5

# Nothing below here will execute due to exec
echo $!
echo "fakeXorg finished..."
sleep 5

그러면 지정한 대로 Xorg가 시작되지만, 우리가 사용한 exec명령은 Xorg동일한 PID를 사용하고 xorg.bash스크립트를 자체적으로 대체하기 때문입니다.

노트:위의 마지막 3줄의 목적은 xorg.bash명령이 실행된 후에 더 이상 재생/실행되지 않음 을 증명하는 것입니다 exec sleep ....

먼저 스크립트를 실행합니다.

$ ./xorg.bash
script's PID: 22471

...5 seconds passes...

starting fakeXorg...

...now the exec runs and 5 more seconds pass...

$

이를 모니터링하기 위해 다른 셸에서 사용한다면 ps auxf다음과 같은 결과를 볼 수 있습니다.

1단계 - xorg.bash 사전 실행
$ ps auxf
....
root     21184  0.0  0.3 116596  3412 pts/2    S    20:19   0:00                  \_ /bin/bash
root     22471  0.0  0.1 113176  1400 pts/2    S+   20:43   0:00                      \_ /bin/bash ./xorg.bash
root     22472  0.0  0.0 107948   348 pts/2    S+   20:43   0:00                          \_ sleep 5
2단계 - xorg.bash 실행 후
$ ps auxf
....
root     21184  0.0  0.3 116596  3412 pts/2    S    20:19   0:00                  \_ /bin/bash
root     22471  0.0  0.0 107948   352 pts/2    S+   20:43   0:00                      \_ sleep 5

1단계에서는 xorg.bashPID가 22471이었지만 2단계에서는 exec sleep 5이제 동일한 PID 22471을 갖습니다.

뒤에 줄exec ...

이 명령의 기능 exec으로 인해 현재 셸이 다른 실행 파일로 대체됩니다.

   $ help exec
    ...
        Replace the shell with the given command.

따라서 xorg.bash해당 시점에서는 더 이상 프로세스로 존재하지 않고 명령으로 대체되었기 exec ....때문에 명령이 실행되지 않습니다.xorg.bashsleep

인용하다

관련 정보