您的位置:首页 > 运维架构 > Shell

Shell脚本中的trap应用

2009-04-27 13:59 197 查看
近期的项目要实现给现有的服务器中的应用程序升级,其中用到了大量的shell脚本,trap只是其中很小的一个应用。它主要用来接收在脚本运行过程中的用户的键盘操作(主要就是Ctrl+C).也就是用户试图中断当前运行的脚本的时候,给出提示。

trap命令用于指定在接收到信号后将要采取的行动,我们将在本书后面的内容中详细介绍信号。trap命令的一种常见用途是在脚本程序被中断时完成清理工作。历史上,shell总是用数字来代表信号,而新的脚本程序应该使用信号的名字,它们保存在用#include命令包含进来的signal.h头文件中,在使用信号名时需要省略SIG前缀。你可以在命令提示符下输入命令trap -l来查看信号编号及其关联的名称。

对于那些不熟悉信号的人们来说,“信号”是指那些被异步发送到一个程序的事件。默认情况下,它们通常会终止一个程序的运行。

trap命令的参数分为两部分,前一部分是接收到指定信号时将要采取的行动,后一部分是要处理的信号名。



请记住,脚本程序通常是以从上到下的顺序解释执行的,所以必须在你想保护的那部分代码以前指定trap命令。
如果要重置某个信号的处理条件到其默认值,只需简单的将command设置为-。如果要忽略某个信号,就把command设置为空字符串‘’。一个不带参数的trap命令将列出当前设置的信号及其行动的清单。
表2-11列出了X/Open规范里面规定的能够被捕获的比较重要的一些信号(括号里面的数字是传统的信号编号)。更多细节请参考signal在线手册的第七部分(man 7 signal)。
表 2-11

信 号
说 明
HUP(1)
挂起,通常因终端掉线或用户退出而引发
INT(2)
中断,通常因按下Ctrl+C组合键而引发
QUIT(3)
退出,通常因按下Ctrl+/组合键而引发
ABRT(6)
中止,通常因某些严重的执行错误而引发
ALRM(14)
报警,通常用来处理超时
TERM(15)
终止,通常在系统关机时发送
实验:信号处理
下面的脚本演示了一些简单的信号处理方法:









运行这个脚本,在每次循环时按下Ctrl+C组合键(或任何你系统上设定的中断键),我们将得到如下所示的输出:



实验解析
在这个脚本程序中,我们先用trap命令安排它在出现一个INT(中断)信号时执行rm –f /tmp/my_tmp_file_$$命令删除临时文件。脚本程序然后进入一个while循环,只要临时文件存在,循环就一直持续下去。当用户按下 Ctrl+C组合键时,就会执行rm –f /tmp/my_tmp_file_$$语句,然后继续下一个循环。因为临时文件现在已经被删除了,所以第一个while循环将正常退出。
接下来,脚本程序再次调用trap命令,这次是指定当一个INT信号出现时不执行任何命令。脚本程序然后重新创建临时文件并进入第二个while循环。这次当用户按下Ctrl+C组合键时,没有语句被指定执行,所以采取默认处理方式,即立即终止脚本程序。因为脚本程序被立即终止了,所以永远也不会执行最后的echo和exit语句。

另外在Bash还有两个伪信号:

代码:
EXIT 	shell从脚本中退出后发送该信号
DEBUG 	shell执行完一条语句后发送该信号


以下是信号列表:
名称    	      默认动作            说明
SIGHUP 	 	终止进程    	终端线路挂断
SIGINT  	终止进程    	中断进程
SIGQUIT 	建立CORE文件	终止进程,并且生成core文件
SIGILL  	建立CORE文件        非法指令
SIGTRAP 	建立CORE文件        跟踪自陷
SIGBUS  	建立CORE文件        总线错误
SIGSEGV 	建立CORE文件        段非法错误
SIGFPE  	建立CORE文件        浮点异常
SIGIOT  	建立CORE文件        执行I/O自陷
SIGKILL 	终止进程    	杀死进程
SIGPIPE 	终止进程    	向一个没有读进程的管道写数据
SIGALARM        终止进程    	计时器到时
SIGTERM 	终止进程    	软件终止信号
SIGSTOP 	停止进程    	非终端来的停止信号
SIGTSTP 	停止进程    	终端来的停止信号
SIGCONT 	忽略信号    	继续执行一个停止的进程
SIGURG  	忽略信号    	I/O紧急信号
SIGIO   	忽略信号    	描述符上可以进行I/O
SIGCHLD 	忽略信号    	当子进程停止或退出时通知父进程
SIGTTOU 	停止进程    	后台进程写终端
SIGTTIN 	停止进程    	后台进程读终端
SIGXGPU 	终止进程    	CPU时限超时
SIGXFSZ 	终止进程    	文件长度过长
SIGWINCH        忽略信号    	窗口大小发生变化
SIGPROF 	终止进程    	统计分布图用计时器到时
SIGUSR1 	终止进程    	用户定义信号1
SIGUSR2 	终止进程    	用户定义信号2
SIGVTALRM       终止进程    	虚拟计时器到时
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: