trap命令使用

trap命令用于捕获指定的信号并执行预定义的命令。
其基本的语法是:
trap ‘command’ signal
其中signal是要捕获的信号,command是捕获到指定的信号之后,所要执行的命令。可以用kill –l命令看到系统中全部可用的信号名,捕获信号后所执行的命令可以是任何一条或多条合法的shell语句,也可以是一个函数名。
shell脚本在执行时,会产生三个所谓的“伪信号”,(之所以称之为“伪信号”是因为这三个信号是由shell产生的,而其它的信号是由操作系统产生的),通过使用trap命令捕获这三个“伪信号”并输出相关信息对调试非常有帮助。
#!/bin/bash
#当捕获到0 也就是脚本执行完时, 则执行 end_fun,其实就是一个清理动作哈哈
. /etc/rc.d/init.d/functions
function end_fun
{
rm -rf /tmp/
echo -en "33[?25h"
}
trap end_fun 0
exit 0

格式:trap “commands” ERR
当命令出错,退出码非0,执行commands指定的命令
http://codingstandards.iteye.com/blog/836588
##当有 ERR时 才执行 end_fun ,这里 echo 2 永远不是ERR 所以不执行end_fun
evan@evan-laptop:~/test$ cat trap
#!/bin/bash
function end_fun
{
rm -rf /tmp/BTO.*
#echo trap
echo -en "33[?25h"
}
trap end_fun ERR
#trap end_fun 0
#apt-get install w3m
echo 2
#exit 1
evan@evan-laptop:~/test$ ls /tmp/BTO.36
evan@evan-laptop:~/test$ ./trap
2
evan@evan-laptop:~/test$ ls /tmp/BTO.36

Linux Signal (1): 基本概念
1. 信号是软件中断:
信号提供了一种处理异步事件的方法. 每个信号都有一个名字, 他们以SIG开头, 如SIGALRM是闹钟信号, 当由alarm函数设置的计时器超时后产生此信号, 然后由SIGALRM的信号处理函数接管处理, 处理之后返回调用alarm函数的应用程序中.
2. 信号编号:
在头文件中, 信号都用宏定义为正整数的信号编号, 不存在编号为0的信号, kill函数对编号为0的信号有特殊的作用. POSIX.1将编号为0的信号定义为空信号, 如果kill中的signo参数为0, 则kill仍执行正常的错误检查, 但不发送信号. 这常被用来通过kill的返回值确定一个特定进程是否存在.
3. 不可忽略/捕捉的信号:
大多数信号都可以通过忽略进行处理, 但SIGKILL和SIGSTOP这两个信号不能被忽略. 因为它们是向超级用户提供使进程终止或停止的可靠方法. 另外, 如果忽略某些硬件异常产生的信号(例如非法内存引用或除0), 则进程的行为是未定义的.
4. 介绍几个常见信号:
SIGINT: 当用户按某些终端键时, 引发终端产生的信号. 如Ctrl+C键, 这将产生中断信号(SIGINT). 它将停止一个已失去控制的程序.
SIGSEGV: 由硬件异常(除数为0, 无效的内存引用等等)产生的信号. 这些条件通常由硬件检测到, 并将其通知内核. 然后内核为该条件发生时正在运行的进程产生该信号.
SIGURG: 在网络连接上传来带外数据时产生.
SIGPIPE: 在管道的读进程已终止后, 一个进程写此管道时产生. 当类型为SOCK_STREAM的socket已不再连接时, 进程写到该socket也产生此信号.
SIGALRM: 进程所设置的闹钟时钟超时的时候产生.
SIGABRT: 进程调用abort函数时产生此信号, 进程异常终止.
SIGCHLD: 在一个进程终止或停止时, 它将把该信号发送给其父进程. 按系统默认, 将忽略此信号. 如果父进程希望被告知其子进程的这种状态改变, 则应该捕捉此信号. 通常是用wait系列函数捕捉, 如果不wait的话, 子进程将成为一个僵尸进程.
SIGIO: 此信号指示一个异步I/O事件.
SIGSYS: 该信号指示一个无效的系统调用.
SIGTSTP: 交互式停止信号. Ctrl+Z, 按下时, 终端将产生此信号, 进程被挂起.
http://hi.baidu.com/zkheartboy/item/29a3868f116638c9b1715456
http://www.cnblogs.com/cnland/archive/2013/05/10/3070457.html

http://liubin.blog.51cto.com/282313/160706
http://www.cnblogs.com/guosixu/archive/2008/07/11/1240821.html