()로 생성된 서브쉘에 별도의 트랩을 지정할 수 있나요?

()로 생성된 서브쉘에 별도의 트랩을 지정할 수 있나요?

일부 작업을 수행하기 위해 하위 쉘을 시작하는 스크립트를 작성 중입니다. 특별한 경우, 스크립트는 하위 쉘에게 수행 중인 작업을 완전히 중지하고 일찍 종료하도록 지시해야 합니다. 그러나 아래 의사코드는 작동하지 않는 것 같습니다. 나는 불가능한 일을 시도하고 있는가? 서브쉘의 신호에 대해 별도의 트랩을 정의할 수 있습니까?

#!/bin/bash

function myExitFunction { ... }
trap myExitFunction SIGTERM

while [ 1 ] ; do
    waitForSpecialCondition

    kill -0 $SUBSHELL_PID   # check if subshell is running
    if [ $? -eq 0 ] ; then  # and kill it if it is
        kill $SUBSHELL_PID
    fi

    (
    someProcess
    MYOWNCHILD=$!           # save someProcess's pid to kill later if I need to
    trap "kill $MYOWNCHILD" SIGTERM
    ... # do stuff
    ) &
    SUBSHELL_PID=$!

done

답변1

알고 보니 내 문제는 내가 생각했던 것과는 달랐다. 다음은 위의 의사코드와 유사하게 동작하는 스크립트입니다. 이는 내가 예상한 대로 정확하게 작동하며(단순화를 위해 조금 더 고안되었지만) 상위 및 하위 셸 프로세스에 대해 별도의 신호 트랩을 설정하는 좋은 예입니다.

간단히 스크립트를 실행하고 ctrl-c를 눌러 종료하면 이 트랩 기능을 확인할 수 있습니다.

#!/bin/bash

function endEarly {
echo "Terminating early"
if [ ! -z $SUBSHELL_PID ] ; then
    echo "Killing subshell with pid $SUBSHELL_PID"
    kill $SUBSHELL_PID
fi
exit
}

trap endEarly SIGTERM SIGINT

echo "Give me some input"
while [ 1 ] ; do
    read INPUT

    # kill the subshell if it exists and is running
    if [ ! -z $SUBSHELL_PID ] ; then
        kill -0 $SUBSHELL_PID
        if [ $? -eq 0 ] ; then
            kill $SUBSHELL_PID
        fi
    fi

    echo "Now I'll repeat your input.  Feel free to change it"
    echo "at any time by typing it again and hitting <Enter>"
    {
        (
            while [ 1 ] ; do
                echo "$INPUT"
                sleep 5
            done
        ) &
        CHILD_PID=$!
        trap "kill $CHILD_PID;" SIGTERM SIGINT
        wait $CHILD_PID
    } &
    SUBSHELL_PID=$!
done

관련 정보