bash下利用trap捕捉信号
- Lan - 淘宝共享数据平台 tbdata.org我在之前的文章里写了myisam读数据压缩的情况,最近决定把它用在生产环境上,所以避免不了写一个“安全”的处理脚本放在DB服务器上,这就引入了本文所讨论的话题. 我希望这个bash脚本在退出的时候做一些事情,包括:. 它启动的切到后台的job需要被杀死;. 在这个脚本里我用到了trap这个命令,关于它,你可以man一下,我这里就不啰嗦了.
我在之前的文章里写了myisam读数据压缩的情况,最近决定把它用在生产环境上,所以避免不了写一个“安全”的处理脚本放在DB服务器上,这就引入了本文所讨论的话题。
我希望这个bash脚本在退出的时候做一些事情,包括:
在这个脚本里我用到了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了一遍,天下文章一大抄,相似的例子,却没有人抛出这个问题。思索了半天,幡然醒悟:
也就是说,等它“睡醒”了,它自然会处理TERM信号的。不信,你多等一会。