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 ~]#
本文来自博客园,作者:尹正杰,转载请注明原文链接:https://www.cnblogs.com/yinzhengjie/p/9337034.html,个人微信: "JasonYin2020"(添加时请备注来源及意图备注,有偿付费)
当你的才华还撑不起你的野心的时候,你就应该静下心来学习。当你的能力还驾驭不了你的目标的时候,你就应该沉下心来历练。问问自己,想要怎样的人生。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!