我有以下脚本,其中有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。当最后一个命令不是一个进程,而是一个read
这是一个内置的 shell,捕获的信号会立即打印出来。为什么会这样呢?如果我执行以下操作,它会起作用:
tail -f /dev/null &
wait $!
如果你看一下man bash https://linux.die.net/man/1/bash:
如果 bash 正在等待命令完成并接收到已设置陷阱的信号,则在命令完成之前不会执行陷阱。当 bash 正在等待异步命令时wait
内置函数中,接收到已设置陷阱的信号将导致 wait 内置函数立即返回,退出状态大于 128,然后立即执行陷阱。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)