• Shell之信号捕获


    前言

      当我们在运行某一段代码的时候,希望有类似事物一样的操作,要么成功,要么失败;一般的shell脚本都是自上而下,从左之后运行,碰到异常信号就会出错,从而终止脚本的运行,这个时候脚本可能运行到某一处数据写入操作的时候,强迫停止,从而造成重大失误,trap可能帮助我们尽量减少这个问题,记住是尽量减少,不等于全部避免。

    trap

      允许你监听指定的信号,并对相应的信号做出对应的反应;

    格式

    trap commands signals
    注意:这里的commands就是在捕获signals信号之后做出的相应反应;捕获信号可以用来做防御操作,也可以用来做进攻操作。

    选项

    -l     列出trap的相关信号

    Linux信号大全

     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

    trap常见的几种操作

    trap "commands" signal-list     # 当脚本收到signal-list清单内列出的信号时,trap命令执行双引号中的命令。
    trap signal-list                # trap不指定任何命令,接受信号的默认操作,默认操作是结束进程的运行。
    trap " " signal-list            # trap命令指定一个空命令串,允许忽视信号,我们常用到的就是这一种。
    trap -- signal-list             # 删除trap的捕获动作

    注意:请记住,脚本程序通常是以从上到下的顺序解释执行的,所以必须在你想保护的那部分代码以前指定trap命令,在不想保护的部分,添加删除捕获动作;

    示例1

    #!/bin/bash
    # test trap command
    trap "echo 'Sorry! I have trapped Ctrl-C'" SIGINT
    
    echo This is a test script
    
    count=1
    while [ $count -le 10 ]
    do
      echo "Loop $count"
      sleep 1
      count=$[ $count + 1 ]
    done
    
    echo The end.

    运行结果

    This is a test script
    Loop 1
    Loop 2
    ^CSorry! I have trapped Ctrl-C
    Loop 3
    Loop 4
    ^CSorry! I have trapped Ctrl-C
    Loop 5
    Loop 6
    Loop 7
    Loop 8
    ^CSorry! I have trapped Ctrl-C
    Loop 9
    Loop 10
    The end.

    示例2

    #!/bin/bash
    # 除了在shell脚本中捕获信号外,也可以在shell退出时捕获,在trap命令后加上EXIT信号就行。
    # test trap command
    trap "echo Goodbye." EXIT
    
    echo This is a test script
    
    count=1
    while [ $count -le 10 ]
    do
      echo "Loop $count"
      sleep 1
      count=$[ $count + 1 ]
    done
    
    echo The end.

    运行结果

    This is a test script
    Loop 1
    Loop 2
    Loop 3
    Loop 4
    Loop 5
    Loop 6
    Loop 7
    Loop 8
    Loop 9
    Loop 10
    The end.
    Goodbye.

    示例3

    #!/bin/bash
    # 修改trap操作
    # test trap command
    
    trap "echo 'Sorry! I have trapped Ctrl-C'" SIGINT
    
    count=1
    while [ $count -le 5 ]
    do
      echo "Loop $count"
      sleep 1
      count=$[ $count + 1 ]
    done
    
    
    trap "echo 'Sorry! The trap has been modified.'" SIGINT
    
    count=1
    while [ $count -le 5 ]
    do
      echo "Loop $count"
      sleep 1
      count=$[ $count + 1 ]
    done
    
    echo The end.

    运行结果:

    Loop 1
    Loop 2
    Loop 3
    ^CSorry! I have trapped Ctrl-C
    Loop 4
    Loop 5
    Loop 1
    Loop 2
    Loop 3
    ^CSorry! The trap has been modified.
    Loop 4
    Loop 5
    The end.

    示例4

    #!/bin/bash
    trap "echo 'Sorry! This is FOR!'" SIGINT
    for ((i=1; i<=10; i++))
      do
        echo "$i"
        sleep 0.1
      done
    
    trap -- SIGINT
    
    for ((i=10; i<=20; i++))
      do
        echo "$i"
        sleep 0.1
      done

    运行结果:

    1
    2
    3
    4
    5
    ^CSorry! This is FOR!
    6
    7
    8
    ^CSorry! This is FOR!
    9
    10
    10
    11
    12
    13
    14
    15
    ^C

    信号翻译地址:https://www.linux.org/threads/kill-signals-and-commands-revised.11625/
    信号参考地址:https://www.cnblogs.com/guge-94/p/11016176.html
    参考学习地址:https://www.jianshu.com/p/b26d4e520385(感谢大佬写的简述,通俗易懂,让后辈学习!)

  • 相关阅读:
    【心情】12月22日
    【心情】12月12日
    【心情】12月8日
    【转载】信息学竞赛知识地图
    SharePoint 2013 工作流之年假审批Designer配置篇
    SharePoint 2013 状态机工作流之扩展自定义状态
    SharePoint 2013 状态机工作流之UpdateItemActivity
    SharePoint 2013 状态机工作流之日常报销示例
    SharePoint 2013 对二进制大型对象(BLOB)进行爬网
    SharePoint 2013 图文开发系列之应用程序页
  • 原文地址:https://www.cnblogs.com/guge-94/p/11019605.html
Copyright © 2020-2023  润新知