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(感谢大佬写的简述,通俗易懂,让后辈学习!)

  • 相关阅读:
    对我影响最大的老师
    秋季学习总结
    介绍自己
    搭建新环境的准备工作
    我的技术博客开通啦!!
    java数组及数组的插入,删除,冒泡算法
    包(package)以及面向对象三个基本特征(继承)的介绍
    常用的Arrays类和二维数组以及二分法的介绍
    构造方法、封装、关键字(this、static)和代码块的介绍
    类和对象的介绍
  • 原文地址:https://www.cnblogs.com/guge-94/p/11019605.html
Copyright © 2011-2022 走看看