trap "ctrl-c" 杀死后台 shell

trap "ctrl-c" 杀死后台 shell

背景

bash 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时,shell 就会变得失去母亲。我希望当或任何其他力信号发生 时,两枚炮弹都会被杀死。spinner $pid
ctrl-c

这里我该如何使用Trap?

答案1

您可以尝试捕获SIGINTin kill 0envar

$ 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
}

这会让子shell也死掉。我测试过:

$ 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

相关内容