트랩 "ctrl-c"는 배경 쉘을 죽입니다

트랩 "ctrl-c"는 배경 쉘을 죽입니다

배경

배쉬 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

관련 정보