zoukankan      html  css  js  c++  java
  • 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(感谢大佬写的简述,通俗易懂,让后辈学习!)

  • 相关阅读:
    中国剩余定理
    hdu1808-Halloween treats(抽屉原理)
    快速幂算法
    因子和与因子个数
    乘性函数
    HDU 2669 Romantic (扩展欧几里得定理)
    扩展欧几里得算法
    Bi-shoe and Phi-shoe(欧拉函数)
    欧拉函数
    [51nod]1284 2 3 5 7的倍数(容斥原理)
  • 原文地址:https://www.cnblogs.com/guge-94/p/11019605.html
Copyright © 2011-2022 走看看