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

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

sleep수동으로 실행 하면 kill -INTsleep이 즉시 종료됩니다. 예를 들어:

$  /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                              

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

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호판.

관련 정보