当最后一个进程处于尾部时未捕获 SIGTERM 信号

Mus*_*afa 2 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
Run Code Online (Sandbox Code Playgroud)

当我kill -15 ${bashpid}从另一个终端使用时,除非使用 CTRL+C,否则不会打印捕获的信号。当最后一个命令不是一个进程,而是一个read内置的 shell 时,捕获的信号将立即打印。为什么会这样呢?如果我执行以下操作,它会起作用:

tail -f /dev/null &
wait $!
Run Code Online (Sandbox Code Playgroud)

Max*_*kin 7

如果你看一下man bash

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