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