技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> Linux --> bash下利用trap捕捉信号量

bash下利用trap捕捉信号量

浏览:3814次  出处信息

我在之前的文章里写了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信号的。不信,你多等一会。

建议继续学习:

  1. Bash的模式和配置文件加载    (阅读:23358)
  2. Bash脚本15分钟进阶教程    (阅读:7477)
  3. bash shell里反斜杠(backslash)和字符串原文输出(无转义)    (阅读:6676)
  4. Bash 小技巧:给目录加上书签,快速切换目录    (阅读:6513)
  5. 两个精彩的比喻:吞吐量和延迟、信号量和互斥锁    (阅读:6005)
  6. Bash如何取得当前正在执行的脚本的绝对路径?    (阅读:4813)
  7. 【总结】美化bash,python的soap client,python获取系统编码函数    (阅读:4298)
  8. Bash Shell 快捷键    (阅读:4006)
  9. .bash_pfofile、.bash_logout和.bashrc    (阅读:3457)
  10. FreeBSD更改csh为bash产生错误的解决办法    (阅读:2107)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1