
sleep
수동으로 실행 하면 kill -INT
sleep이 즉시 종료됩니다. 예를 들어:
$ /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> 참조).