Trap

陷阱“ctrl-c”殺死後台shell

  • July 27, 2021

背景

重擊 4.2

我有兩個文件envarmain.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
}
...

main.sh

source envar

very_slow_and_dangerous_function &
pid=$!
spinner $pid
echo "$jobs done"

問題

當有人在後台按下ctrl-cspinner $pid外殼變得無母。

我希望在ctrl-c發生或任何其他力信號發生時殺死兩個砲彈。

我如何在這裡使用陷阱?

您可以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
}

這將使 subshel​​l 也死掉。我測試過:

$ 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

引用自:https://unix.stackexchange.com/questions/660130