Linux trap --在脚本中处理信号

  • 用途说明

    rap是一个shell内建命令,它用来在脚本中指定信号如何处理。比如,按Ctrl+C会使脚本终止执行,实际上系统发送了SIGINT信号给脚 本进程,SIGINT信号的默认处理方式就是退出程序。如果要在Ctrl+C不退出程序,那么就得使用trap命令来指定一下SIGINT的处理方式了。 trap命令不仅仅处理Linux信号,还能对脚本退出(EXIT)、调试(DEBUG)、错误(ERR)、返回(RETURN)等情况指定处理方式。

    常用参数

           trap [-lp] [[arg] sigspec ...]

     

    格式:trap "commands" signals

    当shell接收到signals指定的信号时,执行commands命令。(The  command arg is to be read and executed when the shell receives signal(s) sigspec.

     

    格式:trap signals

    如果没有指定命令部分,那么就将信号处理复原。比如 trap INT 就表明恢复Ctrl+C退出。(If arg is absent (and there is a single sigspec) or -, each specified signal is reset to its  original  disposition  (the value  it  had  upon  entrance  to  the  shell).

     

    格式:trap "" signals

    忽略信号signals,可以多个,比如 trap "" INT 表明忽略SIGINT信号,按Ctrl+C也不能使脚本退出。又如 trap "" HUP 表明忽略SIGHUP信号,即网络断开时也不能使脚本退出。(If arg is the null string the signal specified by each sigspec is ignored by the shell and by the commands it invokes.

     

    格式:trap -p

    格式:trap -p signal

    把当前的trap设置打印出来。(If arg is not present and -p  has  been supplied,  then  the trap commands associated with each sigspec are displayed.  If no arguments are supplied or if only -p is given, trap prints the list of commands associated  with  each  signal.

     

    格式:trap -l

    把所有信号打印出来。(The  -l option  causes  the shell to print a list of signal names and their corresponding numbers.  Each sigspec is either a signal name defined in <signal.h>, or a signal number.  Signal names  are  case  insensitive and  the  SIG prefix is optional. 

     

    格式:trap "commands" EXIT

    脚本退出时执行commands指定的命令。(If a sigspec is EXIT (0) the command arg is executed on exit from the shell.)

     

    格式:trap "commands" DEBUG

    在脚本执行时打印调试信息,比如打印将要执行的命令及参数列表。(If a sigspec is DEBUG, the command arg is executed before every  simple  command,  for  command, case  command,  select command, every arithmetic for command, and before the first command executes in a shell function (see SHELL GRAMMAR above).  Refer to the description of the extdebug option to the  shopt builtin  for  details of its effect on the DEBUG trap.

     

    格式:trap "commands" ERR

    当命令出错,退出码非0,执行commands指定的命令。(If a sigspec is ERR, the command arg is executed whenever a simple command has a non-zero exit status, subject to the following conditions.  The ERR trap is not executed if the failed command is part of the command list immediately following a while or until keyword, part of the test in an if statement, part of a && or Ι list, or if the command’s return  value is  being  inverted via !.  These are the same conditions obeyed by the errexit option.

     

    格式:trap "commands" RETURN

    当从shell函数返回、或者使用source命令执行另一个脚本文件时,执行commands指定的命令。(If a sigspec is RETURN, the command arg is executed each time a shell function or a script executed with the . or source    builtins  finishes  executing.   Signals  ignored  upon  entry  to the shell cannot be trapped or reset. Trapped signals that are not being ignored are reset to their original values in a child process when it is created.  The return status is false if any sigspec is invalid; otherwise trap returns true.

     

    使用示例

    示例一

    [root@new55 ~]# trap -p

    [root@new55 ~]# trap "echo hello" INT

    [root@new55 ~]# trap -p

    trap -- 'echo hello' SIGINT

    [root@new55 ~]# trap -p INT

    trap -- 'echo hello' SIGINT

    [root@new55 ~]# trap -p QUIT

    [root@new55 ~]# Ctrl+C

    [root@new55 ~]# hello

     

    [root@new55 ~]#

     

    示例二

    [root@new55 ~]# trap -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@new55 ~]#

     

    示例三 在脚本中使用

    下面的脚本用于检查和启动java程序。

    第7行:找出正在运行的符合指定特征的进程;

    第11行:如果找到了这样的进程,就杀掉;

    第22行:以后台方式启动java程序;

    第24行:得到刚启动的程序的pid;

    第28行:对SIGTERM信号设置处理方式:结束启动的java程序;

    第30行:等待后台进程结束。

     

    Bash代码  

    收藏代码

    1. #!/bin/sh  
    2.   
    3. #2007.05.06/07  
    4. 增加了杀掉LAST_PID功能  
    5. 增加了脚本退出时杀掉THIS_PID功能  
    6.   
    7. LAST_PID=$(ps -ef|grep 'java.*Zhenjiang'|grep -v grep|awk '{print $2}')  
    8.   
    9. echo "LAST_PID=$LAST_PID"  
    10.   
    11. if [ -n "$LAST_PID" ] &&  [ "$LAST_PID" -gt 0 ]; then  
    12.     echo "LAST PROCESS NOT EXIT, NOW KILL IT!"  
    13.     kill $LAST_PID  
    14.     sleep 1  
    15. fi  
    16.   
    17. if ! cd ../opt/zhenjiang; then  
    18.     echo "CHANGE DIRECTORY FAILED"  
    19.     exit 1  
    20. fi  
    21.   
    22. java -classpath .:./cpinterfaceapi.jar:./log4j-1.2.14.jar:./hyjc.jar:./smj.client.jar Zhenjiang &  
    23.   
    24. THIS_PID=$!  
    25.   
    26. echo "THIS_PID=$THIS_PID"  
    27.   
    28. trap "kill $THIS_PID" TERM  
    29.   
    30. wait  

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值