日期:2014-05-16  浏览次数:20611 次

关于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 中