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> 참조).