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 @ 2018-07-19 17:20  尹正杰  阅读(591)  评论(0编辑  收藏  举报