다음 쉘 스크립트가 있는 경우
sleep 30s
Ctrl+C쉘 스크립트가 실행되는 동안 이를 클릭하면 sleep
사라집니다.
다음 쉘 스크립트가 있는 경우
sleep 30s &
wait
Ctrl+C쉘 스크립트가 실행되었을 때 sleep
계속을 클릭했는데 이제 상위 항목은 1입니다.
왜 그런 겁니까? 배쉬는 Ctrl+C모든 어린이에게 퍼지지 않을까요 ?
편집: 다음 스크립트가 있는 경우
/usr/bin/Xvfb :18.0 -ac -screen 0 1180x980x24 &
wait
나는 프로그램을 생성 중이고 이번에는 Ctrl+C기본 프로세스의 Xvfb
프로세스도 종료합니다 .
그렇다면 Xvfb
수면과 어떻게/왜 다른가요?
어떤 경우에는 재활용된 것으로 나타났 init
으며 어떤 경우에는 죽었습니다. init에 의해 수면이 재활용되는 이유는 무엇입니까? 왜 Xvfb
죽음인가?
답변1
너무 길어요 박사님;프로세스 Xvfb
는 신호 핸들러를 설정 SIGINT
하고 그러한 신호가 수신되면 종료되지만 프로세스는 sleep
그렇게 하지 않으므로 SIGINT
바이너리를 실행하기 전에 스크립트를 실행한 셸에서 설정했기 때문에 "무시" 상태를 상속받습니다 sleep
.
쉘 스크립트를 실행할 때 작업 제어가 꺼지고 백그라운드 프로세스( 로 시작하는 프로세스 )는 (무시됨) 으로 설정된 &
동일한 프로세스 그룹에서만 실행되며 표준 입력은 다음에서 리디렉션됩니다.SIGINT
SIGQUIT
SIG_IGN
/dev/null
이는 다음으로 인해 발생합니다.기준:
쉘이 비동기 목록을 실행할 때 작업 제어가 비활성화된 경우(set -m 설명 참조) 목록의 명령은 쉘의 SIGINT 및 SIGQUIT 신호에 대한 무시(SIG_IGN) 신호 작업을 상속합니다.
신호 처리가 (무시)로 설정된 경우 상태는 및에 의해 SIG_IGN
상속됩니다 .fork()
execve()
:
호출 프로세스 이미지에서 기본 동작(SIG_DFL)으로 설정된 신호는 새 프로세스 이미지에서도 기본 동작으로 설정되어야 합니다. SIGCHLD 외에도 호출 프로세스 이미지가 무시되도록 설정된 신호(SIG_IGN)가 새 프로세스 이미지에 의해 무시되도록 설정되어야 합니다.
답변2
~에서배쉬 매뉴얼 페이지:
백그라운드 프로세스는 프로세스 그룹 ID가 터미널 프로세스 그룹 ID와 다른 프로세스를 의미하며 이러한 프로세스는 키보드에서 생성된 신호에 영향을 받지 않습니다.
이를 다양한 방법으로 처리할 수 있습니다. 먼저 나열된 작업을 종료합니다.
#!/bin/bash
trap 'kill $(jobs -p)' INT
sleep 30s &
wait
또는 동일한 프로세스 그룹의 모든 프로세스에 kill 명령을 보냅니다.
#!/bin/bash
trap 'kill 0' INT
sleep 30s &
wait
답변3
Bash는 SIGINT 또는 SIGTERM과 같은 신호를 현재 대기 중인 프로세스에 전달하지 않습니다.
일반적인 해결 방법은 다음 예와 같이 트랩 대기를 수행하는 것입니다.
int_handler()
{
kill -TERM "${child_pid}" > /dev/null 2>&1
}
trap 'int_handler' INT
echo "Sleeping ... "
sleep 200 &
child_pid=$!
wait ${child_pid} > /dev/null 2>&1
trap - INT
wait ${child_pid} > /dev/null 2>&1