关于Linux 系统中Java进程崩溃然后自启动问题
JMS消息问题解决了,做事也要做一全套。由于项目已经成功部署,但是不代表以后运行中一直不会出现什么问题。结合以前项目的开发经验,自己又在现场编写了一个类似于看门狗功能的Linux可执行脚本。
如果是单独启动java 进程,脚本如下
#!/bin/bash #配置文本目录 MQ_HOME="/usr/MQ" JDK_ROOT="/bin/jdk1.6.0_06" JDK_CMD="$JDK_ROOT/bin/java" echo "---------------------------------1" export_to_classpath_if_nonexistent() { if [ $# = 1 ]; then if ! echo $CLASSPATH | grep $1 > /dev/null; then export CLASSPATH=$CLASSPATH:$1 fi fi } #使JAVA环境变量生效 export JAVA_HOME=$JDK_ROOT export CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib export PATH=$JAVA_HOME/bin:$PATH #导入程序所需要的jar 包 echo "---------------------------------2" export_to_classpath_if_nonexistent $MQ_HOME/bin export_to_classpath_if_nonexistent $MQ_HOME/lib/activemq-all-5.2.0.jar export_to_classpath_if_nonexistent $MQ_HOME/lib/MQ.jar export_to_classpath_if_nonexistent $MQ_HOME/lib/log4j-1.2.15.jar #这个是启动ActiveMQ Admin 服务程序,并将启动后的日志输出到日志文件中, 其中& 表示在后台运行,在用看门狗功能的时候,这几段需要注释掉 echo "---------------------------------3" /usr/apache-activemq-5.2.0/bin/activemq >> /usr/MQ/logs/activeMQServer.log & sleep 15 echo "Active MQ server started..." #进入MQForward 目录,运行接收转发消息程序 cd $MQ_HOME java com.mq.MQForward &
以上执行脚本单独是可以运行的,但是把他们转换成具有自启动功能的脚本时就有问题了.Linux 系统中查看进程的命令有几种:
ps aux |grep java
这个是查看系统中的java 进程,于是看到系统中有3个(tomcat、activemq、mqforwar)进程,没办法,这三个都是java 进程,不好判断啊,怎么办呢?
ps -e | grep MQForward
结果这种方式用在其他进程可以,后面的MQForward不是实际的进程名称,MQForward实际的进程名就是java。
最后一种,结合起来用
ps aux|grep "activemq"|grep -v grep
最终具有看门狗功能的脚本如下,
#!/bin/bash # # # Source function library. . /etc/rc.d/init.d/functions MQFARWORD_PATH=/usr/MQ MQSERVER_PATH=/usr/apache-activemq-5.2.0 MQLOG_PATH=/usr/MQ/logs #控制改服务是否启动1 启动, 0 不启动 MQFarword=1 MQServer=1 start() { # Start daemons. date >> $MQLOG_PATH/MQ.log echo "Starting activeMQ......" >> $MQLOG_PATH/MQ.log while true; do #run activeMQ admin need to run,first run it! if !(ps aux|grep "activemq"|grep -v grep) >/dev/null ; then if [ -f $MQSERVER_PATH/bin/activemq ] && [ $MQServer = "1" ] ; then /usr/apache-activemq-5.2.0/bin/activemq >> $MQLOG_PATH/activeMQServer.log & echo "Starting activeMQ Server:" >> $MQLOG_PATH/MQ.log echo_success >> $MQLOG_PATH/MQ.log fi sleep 12 fi # run MQFarword if !(ps aux| grep "com.mq.MQForward" | grep -v grep) >/dev/null ; then if [ -f $MQFARWORD_PATH/activeMQ.sh ] && [ $MQFarword = "1" ] ; then /usr/MQ/activeMQ.sh >> $MQLOG_PATH/MQ.log echo "Starting MQForward:" >> $MQLOG_PATH/MQ.log echo_success >> $MQLOG_PATH/MQ.log fi fi sleep 30 done return 0 } # See how we were called. case "$1" in start) start ;; stop) stop ;; *) echo $"Usage: $0 {start|stop}" exit 1 esac exit $RETVAL
最后通过 nohup /JMS.sh start & 启动,可以测试下pkill java 后过一会儿会自动启动,然后把 nohup /JMS.sh start & 加到/etc/rc.local 中