linux命令之trap

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

示例一

[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

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

ps -ef|grep 'java.*onceagain'|grep -v 'grep'|awk '{print $2}':找出正在运行的符合指定特征的进程;grep -v 为反向查找,找出不含grep的行

如果找到了这样的进程,就杀掉;

以后台方式启动java程序;

$!:得到最后一个启动的后台进程的ip

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

等待后台进程结束。

    LAST_PID=$(ps -ef|grep 'java.*onceagain'|grep -v grep|awk '{print $2}')  
      
    echo "LAST_PID=$LAST_PID"  
      
    if [ -n "$LAST_PID" ] &&  [ "$LAST_PID" -gt 0 ]; then  
        echo "LAST PROCESS NOT EXIT, NOW KILL IT!"  
        kill $LAST_PID  
        sleep 1  
    fi  
      
    if ! cd ../opt/caoyue; then  
        echo "CHANGE DIRECTORY FAILED"  
        exit 1  
    fi  
      
    java -classpath .:./cpinterfaceapi.jar:./log4j-1.2.14.jar:./hyjc.jar:./smj.client.jar caoyue &  
      
    THIS_PID=$!  
      
    echo "THIS_PID=$THIS_PID"  
      
    trap "kill $THIS_PID" TERM  
      
    wait  

  

 

你可能感兴趣的:(Linux,shell)