bash 부모-자식 신호 처리

bash 부모-자식 신호 처리

간략한 요약: 부모와 자식은 루프에 있으며 각각 신호를 포착할 수도 있고 포착하지 못할 수도 있습니다. 아이는 문제가 있는데 부모는 문제가 없는데 왜 부모는 해고되지 않는지 이해가 되지 않습니다.

세부 사항:

루프를 실행하고 선택적으로 SIGINT 및 기타 신호를 캡처하는 두 개의 간단한 스크립트가 있습니다. 하위 스크립트는 상위 스크립트에 의해 시작됩니다.

부모:

#!/bin/bash

parent_trap=$1
child_trap=$2

shutdown=0

(( parent_trap )) && trap "echo 'parent: caught signal'; shutdown=1" INT TERM HUP PIPE

while (( ! shutdown )) ; do
    echo parent
    ./child $child_trap
    sleep 1
done

어린이:

#!/bin/bash

child_trap=$1

shutdown=0

(( child_trap )) && trap "echo 'child: caught signal'; shutdown=1" INT TERM HUP PIPE

while (( ! shutdown )) ; do
    echo child
    sleep 1
done

이것이 네 가지 포착 신호 조합으로 실행되는 경우:

트랩 없음:

$ ./parent 0 0
parent
child
child
child
^C

상위 프로세스와 하위 프로세스 모두 ctrl-c로 종료됩니다. 내가 이해한 바에 따르면, 쉘은 핸들러 없이 프로세스 그룹의 모든 프로세스에 SIGINT를 보내 기본 동작인 종료를 호출합니다.

부모와 자녀 모두 어려움에 처해 있습니다.

$ ./parent 1 1
parent
child
child
child
^Cchild: caught signal
parent: caught signal

부모와 자식 모두 신호를 받고 둘 다 깔끔하게 퇴장합니다.

부모는 신호를 포착하지만 자녀는 다음을 수행하지 않습니다.

$ ./parent 1 0
parent
child
child
child
^Cparent: caught signal

상위 프로세스는 신호를 포착하고 깔끔하게 종료됩니다. 그 아이는 해고로 인해 살해당했습니다. (제 생각에는)

하위 프로세스는 신호를 포착하고 상위 프로세스는 신호를 포착하지 않습니다.

$ ./parent 0 1
parent
child
child
child
^Cchild: caught signal
parent
child
^Cchild: caught signal
parent
child
^Cchild: caught signal
^C

하위 프로세스는 신호를 포착하고 깔끔하게 종료되지만, 신호를 포착하지 못한 상위 프로세스는 ctrl-c를 빠르게 두 번 누를 때까지 계속됩니다(하위 프로세스를 다시 시작함).

신호 처리기가 없을 때 부모가 기본 작업으로 종료되지 않는 이유는 무엇입니까?

관련 정보