TRAP 收到信号后不立即执行的问题

来源:互联网 发布:淘宝店铺的模板好卖吗 编辑:程序博客网 时间:2024/06/03 10:58

今天写脚本的时候遇到一个trap不会立即触发的问题。

============bbb.sh======

#!/bin/bash

# traptest.sh

trap "echoBooh!;exit 0" TERM

trap "echo Booh!;exit 0"INT

echo "pid is$$"

sleep 600

===============

运行脚本,执行echo后进入睡眠。此时用ps -xjbbb.shsleep 600在同一个进程组TPGID

重新登入一个登录shell,向该bbb.sh发送INT新号:kill -INT PID或者发送kill -TERM PID

这时bbb.sh会捕捉到这个新号,但是不会立即执行trap表中的程序(echo Booh!;exit 0),而是等到sleep 600这个子进程结束之后才会执行echo Booh!;exit 0。

 

经初步验证,除了不能被捕捉的两个新号-9-19信号外,每当Bash收到一个预先设置等待命令完成的陷阱的信号,在所有的子进程或者子shell退出之前,trap设置的命令不会被执行到。

 

还有另外,当执行bbb.sh在终端运行时,按CTRL+Ctrap会立即触发,bbb.sh结束。

最终的原因是:CTRL+C会向当前前台进程组所有进程(子进程和父进程)都发送一个INT新号。Sleep 600在收到INT新号之后退出,这是bbb.sh捕捉到的INT信号就会触发了。

原创粉丝点击