您的位置:首页 > 其它

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

2012-01-31 20:25 211 查看
今天写脚本的时候遇到一个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 -xj看bbb.sh和sleep
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信号就会触发了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: