在有些情况下,我们不希望自己的shell脚本在运行时刻被中断,比如说我们写得shell脚本设为某一用户的默认shell,使这一用户进入系统后只能作某一项工作,如数据库备份, 我们可不希望用户使用ctrl+C之类便进入到shell状态,做我们不希望做的事情。这便用到了信号处理。
trap命令用来指定shell需要捕捉哪些Linux信号,以及如何处理这些信号。格式如下:
trap commands signals
不同的signal之间用空格隔开,commands表示如何处理signals。
echo trap "echo sorry, I have trapped Ctrl-C" SIGINT SIGTERM trap "echo sorry, I have trapped Ctrl-C" SIGINT SIGTERM echo "Running..." count=1 while [ $count -le 5 ] do echo "Loop $count" count=$(($count + 1)) sleep 2 done echo trap - SIGINT SIGTERM trap - SIGINT SIGTERM #移除捕捉 echo "Ending..."
上述脚本在每次检测到SIGINT或者SIGTERM信号时,简单地显示一行信息,然后继续向下执行,而并不会终止程序。
如果trap命令的signals部分变为”EXIT”会如何呢?此时无论脚本是否正常退出,shell都会在程序终止时执行commands部分:
echo " " echo trap "echo this loop ends" EXIT trap "echo this loop ends" EXIT echo "Running..." count=1 while [ $count -le 5 ] do echo "Loop $count" count=$(($count + 1)) sleep 2 done echo "Ending..."
本文中代码可以从github上面下载,https://github.com/yifeng152/oneShellPracticePerDay.git
对应文件为20150811trap.sh
参考链接:
http://blog.sina.com.cn/s/blog_460757d50100v0ox.html
http://www.cnblogs.com/benxintuzi/p/4720647.html