trap命令用于指定在接收到信号后将要采取的动作
所有支持的signal
trap -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
trap 的使用
1、运行格式
trap命令的参数分为两部分,前一部分是接收到指定信号时将要采取的行动,后一部分是要处理的信号名。
trap command signal
它有三种形式分别对应三种不同的信号回应方式。
第一种:
trap “commands” signal-list
当脚本收到signal-list清单内列出的信号时,trap命令执行双引号中的命令。
第二种:
trap signal-list
trap不指定任何命令,接受信号的默认操作,默认操作是结束进程的运行。
第三种:
trap ” ” signal-list
trap命令指定一个空命令串,允许忽视信号,我们用到的就是这一种。
※ 请记住,脚本程序通常是以从上到下的顺序解释执行的,所以必须在你想保护的那部分代码以前指定trap命令。
实例
trap "" HUP INT QUIT TSTP
这个时候,可以试试打开一个持续的命令,然后中断其运行,例如:
tail -f /var/log/messages
接着,试试用Ctrl+C 或 Ctrl+\ 来中断试试,程序是不会退出的
如果想恢复的话,可以用Ctrl+Z把程序放到后台,然后运行:
trap : HUP INT QUIT TSTP
然后,用ps -ef看看其PID号,用kill 杀掉即可
trap "echo 'Hello World' " HUP INT QUIT TSTP
当运行Ctrl+C 等中断时,会自动运行echo命令,结果就是显示Hello World字符串
trap "echo 'Hello World' > /opt/trap.txt " HUP INT QUIT TSTP
当运行Ctrl+C 等中断时,会将Hello World输出到/opt/trap.txt中
![](https://www.wmmzz.com/wp-content/uploads/2021/02/image-49.png)
在这个例子中,当sleep的时候,按下了CTRL+C, 却没有成功捕获SIGINT 信号,为什么呢?
trap以及sleep运行的时候,各自分别产生了一个child process , 把trap对应的child process 记作A, sleep 对应的child process 记作为B. 而trap只是对其父进程起作用,而对父进程的子进程并不起作用,而B进程(sleep)属于A的父进程的子进程;所以trap命令无法对sleep命令的SIGINT起作用;
![](https://www.wmmzz.com/wp-content/uploads/2021/02/image-50.png)
而如果把着两条命令放到一个脚本中,则会起作用,因为当运行脚本的时候, 按下ctrl+c触发的SIGINT信号被发送到了bash脚本对应的进程,而trap作为脚本中的一条命令,它本身是脚本的子进程,所以其父进程就是脚本进程;因此trap捕获到了SIGINT信号,此时trap捕获的是 发送给脚本的SIGINT信号,而不是发送给sleep的SIGINT信号;也就是说trap不可能捕获发送给sleep的任何信号;
从上述介绍的trap可以捕获signal的范围来讲,trap的使用基本都是在 bash服务脚本中
信号详情
引用名称 默认动作 说明
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 终止进程 虚拟计时器到时
参考文献:
https://blog.csdn.net/weixin_30703911/article/details/96862888