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