bash下利用trap捕捉信号

标签: 所有 bash trap 信号 | 发表时间:2011-03-04 21:31 | 作者:朋春 Lan
出处:http://www.tbdata.org

我在之前的文章里写了myisam读数据压缩的情况,最近决定把它用在生产环境上,所以避免不了写一个“安全”的处理脚本放在DB服务器上,这就引入了本文所讨论的话题。

我希望这个bash脚本在退出的时候做一些事情,包括:

  1. 它启动的切到后台的job需要被杀死;
  2. 一些临时文件的清理。

在这个脚本里我用到了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了一遍,天下文章一大抄,相似的例子,却没有人抛出这个问题。思索了半天,幡然醒悟:

  1. kill(killall)命令只是发出一个TERM信号(15),至于这个信号是否被对应进程捕捉并处理了,它并不管;
  2. kill发出的时候,test_trap.sh正在sleep——这个时间有点长(30秒)。

也就是说,等它“睡醒”了,它自然会处理TERM信号的。不信,你多等一会。

相关 [bash 利用 trap] 推荐:

bash下利用trap捕捉信号

- Lan - 淘宝共享数据平台 tbdata.org
我在之前的文章里写了myisam读数据压缩的情况,最近决定把它用在生产环境上,所以避免不了写一个“安全”的处理脚本放在DB服务器上,这就引入了本文所讨论的话题. 我希望这个bash脚本在退出的时候做一些事情,包括:. 它启动的切到后台的job需要被杀死;. 在这个脚本里我用到了trap这个命令,关于它,你可以man一下,我这里就不啰嗦了.

在脚本中使用 trap

- jiaosq - IBM developerWorks 中国 : 文档库
要使脚本具有合理的健壮性,需要满足的条件之一就是能够清除强制终止后留下的任何临时日志或进程. 另一项需要考虑的因素是,在收到来自用户的中断后,应当采取哪些相应措施. 通过使用 shell 内置 trap 命令和记录器 (logger) 工具,这些工具有助于提高脚本在被强制终止时的健壮性. 在本文中,我将演示使用 trap 和记录器的方法.

高效操作Bash

- Eneri - 极限手指
我们在平常工作中大量使用linux, 而使用linux的过程中操作Bash更是非常之频繁, 所以怎样高效的操作Bash是一个非常重要的问题. 下面我结合自己的经验总结一下高效操作Bash的一些技巧. 1 快捷键 1.1 注意. 2 历史扩展 2.1 概念. 2.2 事件指示器(Event Designators).

处理Apache日志的Bash脚本

- guoan - 阮一峰的网络日志
去年一年,我写了将近100篇网络日志. 现在这一年结束了,我要统计"访问量排名",看看哪些文章最受欢迎. (隆重预告:本文结尾处将揭晓前5名. 以往,我用的是AWStats日志分析软件. 它可以生成很详细的报表,但是不太容易定制,得不到某些想要的信息. 所以,我就决定自己写一个Bash脚本,统计服务器的日志,顺便温习一下脚本知识.

Bash脚本15分钟进阶指导

- - 外刊IT评论网
这里的技术技巧最初是来自谷歌的“Testing on the Toilet” (TOTT). 我的所有bash脚本都以下面几句为开场白:. 这样做会避免两种常见的问题:. 引用未定义的变量(缺省值为“”). 需要注意的是,有些Linux命令的某些参数可以强制忽略发生的错误,例如“mkdir -p” 和 “rm -f”.

[转]休息五分钟,学几个bash快捷键

- 王者自由 - C++博客-首页原创精华区
停下手里活,学点一举两得的小技能,保证五分钟搞定. Ctrl-A 相当于HOME键,用于将光标定位到本行最前面. Ctrl-E 相当于End键,即将光标移动到本行末尾. Ctrl-B 相当于左箭头键,用于将光标向左移动一格. Ctrl-F 相当于右箭头键,用于将光标向右移动一格. Ctrl-D 相当于Del键,即删除光标所在处的字符.

[转]Bash Shell 快捷键的学习使用

- SotongDJ - OwnLinux.cn
大量在时候在使用 bash shell 的时候,熟悉快捷键是多么爽的一件事. 刚刚无意在 Fenng 哥的博客上看到了一篇关于 bash shell 快捷键的文章,总结得相当好.

Bash远程解析命令执行漏洞测试方法

- - FreeBuf.COM
从昨天开始,这个从澳大利亚远渡重洋而来的BASH远程命令执行漏洞就沸腾了整个FreeBuf,大家都在谈论,“互联网的心脏又出血了”,可是,亲,到底怎么对网站进行测试. 真的如各路大神们说的这样吗. 它与“心脏出血”漏洞不同,“心脏出血”只能借助窃取用户电脑信息,而bash 漏洞允许黑客远程控制电脑,拿到系统最高权限.

Bash漏洞批量检测工具与修复方案

- - FreeBuf.COM
Linux官方内置Bash中新发现一个非常严重. 安全漏洞 ,黑客可以利用该Bash漏洞完全控制目标系统并发起攻击. Bash远程命令执行漏洞(CVE2014-6271)检测脚本. 作者:ziwen(dn8.net团队). 运行环境:python 2.7‍ ‍. 脚本会将结果回显出来 如果存在漏洞的话还会把passwd文件保存在以目标域名+output命名的txt文档里,不成功不保存.

威胁远胜“心脏出血”?国外新爆Bash高危安全漏洞

- - FreeBuf.COM
这几天Linux用户们可能不能愉快地玩耍了,红帽(Redhat)安全团队昨天爆出一个危险的Bash Shell漏洞. 其带来的威胁可能比早前披露的“心脏出血”漏洞更大更强. [OpenSSL心脏出血漏洞全回顾]  http://www.freebuf.com/articles/network/32171.html.