linux命令之trap

本文详细介绍了Shell脚本中的Trap命令,该命令用于指定脚本如何处理各种信号,如SIGINT、SIGTERM等。通过示例展示了如何使用Trap命令自定义信号处理方式,例如在接收到Ctrl+C时打印消息而非直接退出程序。此外,还提供了一个实用脚本,用于检查并启动特定的Java程序,同时展示了如何利用Trap命令确保程序能够优雅地响应终止信号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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  

  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值