bash下利用trap捕捉信号量
浏览:3805次 出处信息
我在之前的文章里写了myisam读数据压缩的情况,最近决定把它用在生产环境上,所以避免不了写一个“安全”的处理脚本放在DB服务器上,这就引入了本文所讨论的话题。
我希望这个bash脚本在退出的时候做一些事情,包括:
它启动的切到后台的job需要被杀死;
一些临时文件的清理。
在这个脚本里我用到了trap这个命令,关于它,你可以man一下,我这里就不嗦了。直接上示例代码:
$ cat test_trap.sh declare -i run_terminate=0 trap "run_terminate=1" SIGINT SIGTERM # 启动io监控,IO较大时不进行压缩 vmstat 1 >> ./a.log & while [ ${run_terminate} -eq 0 ] do # 核心代码 sleep 30 done for pid in $(ps -ef | awk -v p=${$} '{if ($3 == p){print $2}}') do kill -9 ${pid} > /dev/null done rm -f ./a.log echo "Terminated."
在上面的代码中,我们捕捉INT信号(CTRL+C)和TERM信号(kill产生)。运行程序:
$ /bin/bash test_trap.sh ^C
按照我们预期的,当我CTRL+C退出程序,或者kill进程时,上面的脚本应该停掉vmstat进程,并且删除a.log,输出“Terminated”后退出。
但是,CTRL+C确实按照我们的设想进行了。可kill之后程序并没有任何反应,这是为何?
Google了一遍,天下文章一大抄,相似的例子,却没有人抛出这个问题。思索了半天,幡然醒悟:
kill(killall)命令只是发出一个TERM信号(15),至于这个信号是否被对应进程捕捉并处理了,它并不管;
kill发出的时候,test_trap.sh正在sleep——这个时间有点长(30秒)。
也就是说,等它“睡醒”了,它自然会处理TERM信号的。不信,你多等一会。
建议继续学习:
- Bash的模式和配置文件加载 (阅读:23349)
- Bash脚本15分钟进阶教程 (阅读:7466)
- bash shell里反斜杠(backslash)和字符串原文输出(无转义) (阅读:6669)
- Bash 小技巧:给目录加上书签,快速切换目录 (阅读:6500)
- 两个精彩的比喻:吞吐量和延迟、信号量和互斥锁 (阅读:5990)
- Bash如何取得当前正在执行的脚本的绝对路径? (阅读:4797)
- 【总结】美化bash,python的soap client,python获取系统编码函数 (阅读:4290)
- Bash Shell 快捷键 (阅读:4004)
- .bash_pfofile、.bash_logout和.bashrc (阅读:3450)
- FreeBSD更改csh为bash产生错误的解决办法 (阅读:2100)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:grep 正则表达式选项要记得转义
后一篇:其实你不懂wget的心-04 >>
文章信息
- 作者:朋春 来源: 淘宝数据平台与产品部官方博客 tbdata.org
- 标签: bash trap 信号量
- 发布时间:2011-03-06 22:51:43
建议继续学习
近3天十大热文
- [54] IOS安全–浅谈关于IOS加固的几种方法
- [52] android 开发入门
- [52] 如何拿下简短的域名
- [51] 图书馆的世界纪录
- [49] Go Reflect 性能
- [49] Oracle MTS模式下 进程地址与会话信
- [47] 【社会化设计】自我(self)部分――欢迎区
- [46] 读书笔记-壹百度:百度十年千倍的29条法则
- [37] 程序员技术练级攻略
- [29] 视觉调整-设计师 vs. 逻辑