f01에 대한 의견에서 언급했듯이 SIGTERM을 자식 프로세스로 보내야합니다. ^ C를 포착하고 자식 프로세스에 신호를 보내는 방법을 보여주는 두 개의 스크립트가 있습니다.
먼저 부모님.
트랩 테스트
#!/bin/bash
# trap test
# Written by PM 2Ring 2014.10.23
myname=$(basename "$0")
child=sleeploop
set_trap()
{
sig=$1
msg="echo -e \"\n$myname received ^C, sending $sig to $child, $pid\""
trap "$msg; kill -s $sig $pid" SIGINT
}
trap "echo \"bye from $myname\"" EXIT
echo "running $child..."
./$child 5 &
pid=$!
# set_trap SIGINT
set_trap SIGTERM
echo "$child pid = $pid"
wait $pid
echo "$myname finished waiting"
그리고 지금, 아이.
슬립 루프
#!/bin/bash
# child script for traptest
# Written by PM 2Ring 2014.10.23
myname=$(basename "$0")
delay="$1"
set_trap()
{
sig=$1
trap "echo -e '\n$myname received $sig signal';exit 0" $sig
}
trap "echo \"bye from $myname\"" EXIT
set_trap SIGTERM
set_trap SIGINT
#Select sleep mode
if false
then
echo "Using foreground sleep"
Sleep()
{
sleep $delay
}
else
echo "Using background sleep"
Sleep()
{
sleep "$delay" &
wait $!
}
fi
#Time to snooze :)
for ((i=0; i<5; i++));
do
echo "$i: sleeping for $delay"
Sleep
done
echo "$myname terminated normally"
traptest가 SIGTERM을 보내면 잘 동작하지만 traptest가 SIGINT를 보내면 sleeploop는 그것을 보지 않습니다.
슬립 루프가 SIGTERM을 포착하고 슬립 모드가 포 그라운드이면 현재 슬립에서 깨어날 때까지 신호에 응답 할 수 없습니다. 그러나 수면 모드가 백그라운드이면 즉시 응답합니다.
set -m
.setsid
아이 를 뛸 때마다 사용 하는 것보다 조금 더 깨끗하고 간단 합니다.