절전, 대기 및 Ctrl+C 전파

절전, 대기 및 Ctrl+C 전파

다음 쉘 스크립트가 있는 경우

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.

쉘 스크립트를 실행할 때 작업 제어가 꺼지고 백그라운드 프로세스( 로 시작하는 프로세스 )는 (무시됨) 으로 설정된 &동일한 프로세스 그룹에서만 실행되며 표준 입력은 다음에서 리디렉션됩니다.SIGINTSIGQUITSIG_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

관련 정보