쉘 스크립트에서 실행될 때 sleep이 SIGINT를 무시하는 이유는 무엇입니까?

쉘 스크립트에서 실행될 때 sleep이 SIGINT를 무시하는 이유는 무엇입니까?

sleep수동으로 실행한 다음 kill -INT절전 모드가 즉시 종료됩니다. 예를 들어:

$  /bin/sleep  60  &
[1] 4002356
$  kill -INT 4002356
[1]+  Interrupt               /bin/sleep 60
$  ps -C sleep
    PID TTY          TIME CMD
$  

sleep그러나 쉘 스크립트에서 동일한 작업 을 수행하면 SIGINT. 예를 들어:

set  -o xtrace

echo
/bin/sleep  10  &
child="$!"
/bin/sleep  0.1
ps -C sleep
kill  -TERM  "$child"    #  SIGTERM                                         
/bin/sleep  0.1
ps -C sleep
wait  "$child"    #  will return immediately                                

echo
/bin/sleep  10  &
child="$!"
/bin/sleep  0.1
ps -C sleep
kill  -INT  "$child"    #  SIGINT
/bin/sleep  0.1
ps -C sleep
wait  "$child"    #  will wait for 9.8 seconds                              

쉘 스크립트 내에서 SIGINT실행할 때 수면이 왜/어떻게 무시됩니까 ?sleep

dash나는 및 와 동일한 동작을 얻습니다 bash. 내 커널은 Linux 5.4.0입니다.

답변1

/bin/sleep 10 &종료 시 쉘 &sleep비동기적으로 실행됩니다. 작업 제어는 기본적으로 스크립트에서 비활성화되어 있습니다. Bash에서는 다음이 적용됩니다.

Bash에 의해 시작되는 비내장 명령에는 쉘이 부모로부터 상속받은 값으로 설정된 신호 처리기가 있습니다.작업 제어가 적용되지 않으면 비동기 명령은 SIGINT를 무시합니다.이러한 상속된 핸들러 외에 SIGQUIT도 있습니다.

원천:배쉬 참조 매뉴얼.

이와 관련하여 는 을 제외하고 에 SIG_IGN대한 호출 전반에 걸쳐 지속됩니다 .execv()SIGCHLD

호출 프로세스 이미지에서 기본 동작(SIG_DFL)으로 설정된 신호는 새 프로세스 이미지에서 기본 동작으로 설정되어야 합니다. SIGCHLD를 제외하고, 호출 프로세스 이미지에 의해 무시되도록 설정된 신호(SIG_IGN)는 새로운 프로세스 이미지에 의해 무시되도록 설정되어야 합니다. 호출 프로세스 이미지에 의해 포착되도록 설정된 신호는 새 프로세스 이미지의 기본 동작으로 설정됩니다(<signal.h> 참조).

원천:Open Group 기본 사양 2018년 7호판.

관련 정보