• 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 ~]# 
  • 相关阅读:
    Cocos2d-x 2.2.3 Android配置
    于ubuntu配置hadoop当问题
    Xenomai 3 和 PREEMPT_RT 有哪些优势相比,
    【安卓注意事项】模仿猎豹清理大师波效应
    JPA实体继承映射
    第26周日许昌夜
    第26周六悲剧许昌夜
    第26黑色周五
    第26周四
    第26周三
  • 原文地址:https://www.cnblogs.com/yinzhengjie/p/9337034.html
Copyright © 2020-2023  润新知