배경
배쉬 4.2
envar
파일이 두 개 있어요main.sh
엥발
...
# displays a spinner so that user knows the job is under processing.
spinner()
{
spin='-\|/'
i=0
while kill -0 $1 2>/dev/null
do
i=$(( (i+1) %4 ))
printf "\e[1;33m"
printf "\r${spin:$i:1}"
printf "\e[m"
sleep .1
done
}
...
메인 디렉토리
source envar
very_slow_and_dangerous_function &
pid=$!
spinner $pid
echo "$jobs done"
질문
누군가가 배경을 누르면 ctrl-c
껍질은 어미가 없게 됩니다. 나는 다른 강제 신호가 발생할 때 두 포탄이 모두 죽기를 원합니다.spinner $pid
ctrl-c
여기서 Trap을 어떻게 사용해야 하나요?
답변1
SIGINT
다음에서 캡처를 시도할 수 있습니다 kill 0
.envar
$ cat envar
trap "kill 0" SIGINT
spinner()
{
spin='-\|/'
i=0
while kill -0 $1 2>/dev/null
do
i=$(( (i+1) %4 ))
printf "\e[1;33m"
printf "\r${spin:$i:1}"
printf "\e[m"
sleep .1
done
}
이로 인해 서브쉘도 죽게 됩니다. 내가 테스트한 내용은 다음과 같습니다.
$ cat foo.sh
#!/bin/bash
## source your function file
. envar
sleep 600 &
pid=$!
spinner $pid
echo "$jobs done"
이것을 실행하고 Ctrl+로 종료하면 다음과 같은 C결과가 발생합니다.
$ foo.sh
/^CTerminated
$ pgrep -c sleep
0