当最后一个进程是tail时,SIGTERM信号没有被捕获

时间:2018-03-27 08:23:24

标签: linux bash signals

我有以下脚本,其中包含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 $!

1 个答案:

答案 0 :(得分:2)

如果您查看man bash

  

如果bash正在等待命令完成并收到已设置陷阱的信号,则在命令完成之前不会执行陷阱。当bash通过wait内置命令等待异步命令时,接收到已设置陷阱的信号将导致等待内置函数立即返回,退出状态大于128,之后立即执行陷阱被执行。

相关问题