我有以下脚本,其中包含tail --pid=${somepid} -f ${mylogs}
。我想抓住SIGTERM
并对该PID进行一些优雅的关闭,因为该过程不理解SIGTERM
并且痛苦地死去。
echo "pid: $$"
trap_with_arg() {
func="$1" ; shift
for sig ; do
trap "$func $sig" "$sig"
done
}
func_trap() {
echo Trapped: $1
}
trap_with_arg func_trap INT TERM EXIT STOP
tail -f /dev/null
当我从另一个终端使用kill -15 ${bashpid}
时,在我使用CTRL + C之前不会打印捕获的信号。当最后一个命令不是一个进程,而是一个内置shell的read
时,会立即打印出捕获的信号。为什么会这样?如果我执行以下操作,它将起作用:
tail -f /dev/null &
wait $!
答案 0 :(得分:2)
如果您查看man bash
:
如果bash正在等待命令完成并收到已设置陷阱的信号,则在命令完成之前不会执行陷阱。当bash通过
wait
内置命令等待异步命令时,接收到已设置陷阱的信号将导致等待内置函数立即返回,退出状态大于128,之后立即执行陷阱被执行。