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信号就会触发了。
============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信号就会触发了。
相关文章推荐
- js 立即执行函数 问题
- gdb不停收到sigtrap信号
- gdb不停收到sigtrap信号
- linux中脚本扑捉(trap)信号问题
- Quartz,启动不立即执行问题
- domino服务器繁忙时压缩操作不立即执行问题
- 关于this 方法中套方法中找 立即执行的问题 等问题
- 使用gdb调试网络程序时,收到SIGPIPE信号异常退出问题
- 查找jQuery的ready立即执行的问题
- 用立即执行函数 解决闭包问题
- 项目实现过程中遇到的问题记录(一)------------使用AsyncTask时,doInBackground没有立即执行
- 【Android实战】----调用startActivityForResult()后,onActivityResult()立即执行的问题
- asp.net: 点击<asp:button/>按钮时有时不能立即执行问题
- JavaScript之闭包问题以及立即执行函数
- domino服务器繁忙时压缩操作不立即执行问题
- Android startActivityForResult onActivityResult 立即执行 和不执行的问题
- for循环内绑定事件的问题(立即执行与延迟执行)。
- JavaScript之闭包问题以及立即执行函数
- 使用AndroidStudio执行UI Automator 自动化测试版本问题
- OMSA系统信号集问题