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-1011-2021-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 ~]# 
复制代码

 

posted @   尹正杰  阅读(611)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示