SHELL脚本编程-信号捕捉trap
SHELL脚本编程-信号捕捉trap
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.查看Linux支持的信号
[root@node101.yinzhengjie.org.cn ~]# kill -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 [root@node101.yinzhengjie.org.cn ~]#
二.信号捕捉trap实战案例
1>.trap命令常用的选项
trap '触发指令' 信号 进程收到系统发出的指定信号后,将执行自定义指令,而不会执行原操作 trap '' 信号 忽略信号的操作 trap '-' 信号 恢复原信号的操作 trap -p 列出自定义信号操作 trap finish EXIT 当脚本退出时,执行finish函数,当然这个"finish"这个名字是可以自定义的哟~
2>.捕捉SIGINT信号案例
[root@node101.yinzhengjie.org.cn ~]# cat shell/trap.sh #!/bin/bash # #******************************************************************** #Author: yinzhengjie #QQ: 1053419035 #Date: 2019-11-28 #FileName: shell/trap.sh #URL: http://www.cnblogs.com/yinzhengjie #Description: The test script #Copyright notice: original works, no reprint! Otherwise, legal liability will be investigated. #******************************************************************** #捕获SIGINT信号,即2信号,可以使用kill -l命令查看Linux支持的信号列表 trap 'echo "signal:SIGINT"' 2 trap -p for((i=0;i<=10;i++));do sleep 1 echo $i done [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# bash shell/trap.sh #我们发现在执行脚本期间,按住"ctrl +c"并不能终止脚本,而是该信号被"trap"命令捕捉到了,并执行了相应的echo命令。 trap -- 'echo "signal:SIGINT"' SIGINT 0 ^Csignal:SIGINT 1 2 ^Csignal:SIGINT 3 ^Csignal:SIGINT 4 ^Csignal:SIGINT 5 ^Csignal:SIGINT 6 7 ^Csignal:SIGINT 8 ^Csignal:SIGINT 9 ^Csignal:SIGINT 10 [root@node101.yinzhengjie.org.cn ~]#
3>.捕捉2信号和15信号
[root@node101.yinzhengjie.org.cn ~]# cat shell/trap.sh #!/bin/bash # #******************************************************************** #Author: yinzhengjie #QQ: 1053419035 #Date: 2019-11-28 #FileName: shell/trap.sh #URL: http://www.cnblogs.com/yinzhengjie #Description: The test script #Copyright notice: original works, no reprint! Otherwise, legal liability will be investigated. #******************************************************************** #捕获2信号和15信号 trap 'echo "signal:SIGINT"' 2 15 trap -p for((i=0;i<=10;i++));do sleep 1 echo $i done #捕获到2和15信号后,执行命令为'',即捕捉到2和15信号啥也不干 trap '' 2 15 trap -p for ((i=11;i<=20;i++));do echo $i sleep 1 done [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# bash shell/trap.sh #注意观察,我们在0-10之间按"ctrl +c"时会有提示信息,但是在11-20之间按"ctrl +c"则信号被忽略了,啥也没有提示咱们。 trap -- 'echo "signal:SIGINT"' SIGINT trap -- 'echo "signal:SIGINT"' SIGTERM 0 ^Csignal:SIGINT 1 2 3 ^Csignal:SIGINT 4 5 6 7 8 9 ^Csignal:SIGINT 10 trap -- '' SIGINT trap -- '' SIGTERM 11 12 13 ^C14 ^C15 ^C16 ^C17 ^C18 ^C19 20 [root@node101.yinzhengjie.org.cn ~]#
4>.恢复原信号行为
[root@node101.yinzhengjie.org.cn ~]# cat shell/trap.sh #!/bin/bash # #******************************************************************** #Author: yinzhengjie #QQ: 1053419035 #Date: 2019-11-28 #FileName: shell/trap.sh #URL: http://www.cnblogs.com/yinzhengjie #Description: The test script #Copyright notice: original works, no reprint! Otherwise, legal liability will be investigated. #******************************************************************** #捕获2信号和15信号 trap 'echo "signal:SIGINT"' 2 15 trap -p for((i=0;i<=10;i++));do sleep 1 echo $i done #捕获到2和15信号后,执行命令为'',即捕捉到2和15信号啥也不干 trap '' 2 15 trap -p for ((i=11;i<=20;i++));do echo $i sleep 1 done #捕捉到2和15信号后,执行命令为'-',即捕捉到2和15信号后恢复原有操作 trap '-' 2 15 trap -p for ((i=21;i<=30;i++));do echo $i sleep 1 done [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# bash shell/trap.sh #注意观察,在数字1-10,11-20,21-30之间按"ctrl +c"的变化,只有在打印"21-30"之间按"ctrl +c"才会退出程序。 trap -- 'echo "signal:SIGINT"' SIGINT trap -- 'echo "signal:SIGINT"' SIGTERM 0 1 2 3 4 ^Csignal:SIGINT 5 6 7 ^Csignal:SIGINT 8 9 ^Csignal:SIGINT 10 trap -- '' SIGINT trap -- '' SIGTERM 11 12 13 ^C14 15 16 17 ^C18 19 20 21 22 ^C [root@node101.yinzhengjie.org.cn ~]#
5>.捕捉退出信号
[root@node101.yinzhengjie.org.cn ~]# cat shell/trap.sh #!/bin/bash # #******************************************************************** #Author: yinzhengjie #QQ: 1053419035 #Date: 2019-11-28 #FileName: shell/trap.sh #URL: http://www.cnblogs.com/yinzhengjie #Description: The test script #Copyright notice: original works, no reprint! Otherwise, legal liability will be investigated. #******************************************************************** finish() { echo "Finish!!!" } #捕捉exit(退出)信号,无论程序正常或异常退出,都会执行finsh函数。 trap finish exit for((i=1;i<=10;i++));do let sum+=i sleep 1 done echo $sum [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# bash shell/trap.sh #程序正常退出 55 Finish!!! [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# bash shell/trap.sh #我们让程序不要正常退出,而是手动按"ctrl +c",会发现调用了finsh函数。 ^CFinish!!! [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]#
当你的才华还撑不起你的野心的时候,你就应该静下心来学习。当你的能力还驾驭不了你的目标的时候,你就应该沉下心来历练。问问自己,想要怎样的人生。
欢迎交流学习技术交流,个人微信: "JasonYin2020"(添加时请备注来源及意图备注)
作者: 尹正杰, 博客: https://www.cnblogs.com/yinzhengjie/p/9337034.html