1. 程式人生 > >linux環境java應用通用啟動shell指令碼

linux環境java應用通用啟動shell指令碼

     對於java應用部署在linux環境分兩種情況,一為war包,應用入口為編譯後的classes檔案下的本身應用入口,其啟動指令碼可參考不錯的linux下通用的java程式啟動指令碼這篇部落格。

    一為jar包形式

這種便於打包增量升級,關注於改動的jar即可。此應用的結構正是用微服務框架springboot快速搭建並配合以下shell指令碼部署linux。

#!/bin/bash

#此指令碼為Linux下啟動java程式的通用指令碼。(包含啟動,停止,重啟)
#cd 進入指令碼執行的bin目錄,sh server.sh start(啟動) | stop(停止)| restart(重啟)
#
#Author: ant.ding, Date: 2017/8/31
#

#bin目前路徑以及相關目錄路徑
cd `dirname $0`
BIN_DIR=`pwd`
cd ..
DEPLOY_DIR=`pwd`
CONF_DIR=$DEPLOY_DIR/conf
LOGS_DIR=$DEPLOY_DIR/logs
LIB_DIR=$DEPLOY_DIR/lib
MAIN_CLASS=com.goldenway.small.Application

# config file dir
SERVER_NAME=DEPLOY_DIR

STDOUT_FILE=$LOGS_DIR/stdout.log

LOG_BACK="-Dlogback.configurationFile=conf/logback.xml"
cmd=$2
echo "$cmd"

start(){
    echo "CONF_DIR=$CONF_DIR"
	PIDS=`ps  --no-heading -C java -f --width 1000 | grep "$CONF_DIR" |awk '{print $2}'`
	if [ -n "$PIDS" ]; then
	   	 echo "ERROR: The $SERVER_NAME already started!"
	    echo "PID: $PIDS"
	    exit 1
	fi

	if [ ! -d $LOGS_DIR ]; then
		mkdir $LOGS_DIR
	fi


	LIB_JARS=`ls $LIB_DIR|grep .jar|awk '{print "'$LIB_DIR'/"$0}'|tr "\n" ":"`
	for xml in $DEPLOY_DIR/*.xml
		do	LIB_JARS=$LIB_JARS:$xml
	done
	for env in $DEPLOY_DIR/*.properties
		do	LIB_JARS=$LIB_JARS:$env
	done


	JAVA_OPTS=" -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true "
	JAVA_DEBUG_OPTS=""
	if [ "$cmd" = "debug" ]; then
	    JAVA_DEBUG_OPTS=" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n "
	fi
	JAVA_JMX_OPTS=""
	if [ "$cmd" = "jmx" ]; then
		ip=$(ifconfig | grep "inet addr" | grep -v 127.0.0.1 | awk '{print $2}' | awk -F ':' '{print $2}')
	    JAVA_JMX_OPTS=" -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false  -Djava.rmi.server.hostname=$ip "
	fi
	JAVA_MEM_OPTS=""
	BITS=`file $JAVA_HOME/bin/java | grep 64-bit`
	echo "BITS =$BITS"
	if [ -n "$BITS" ]; then
		  JAVA_MEM_OPTS=" -server -Xmx2g -Xms2g -Xmn256m -XX:PermSize=128m  -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 "
	else
		JAVA_MEM_OPTS=" -server -Xms1g -Xmx1g -XX:PermSize=128m -XX:SurvivorRatio=2 -XX:+UseParallelGC "
	fi

	echo "JAVA_MEM_OPTS=$JAVA_MEM_OPTS"
	echo "JAVA_JMX_OPTS=$JAVA_JMX_OPTS"

	echo -e "Starting the $SERVER_NAME ...\c"
	nohup java $JAVA_OPTS $JAVA_MEM_OPTS $LOG_BACK $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS -classpath $DEPLOY_DIR:$LIB_DIR:$CONF_DIR:$LIB_JARS $MAIN_CLASS > /dev/null  2>>$STDOUT_FILE &

	COUNT=0
	while [ $COUNT -lt 1 ]; do    
	    echo -e ".\c"
	    sleep 1 
	
	    COUNT=`ps  --no-heading -C java -f --width 1000 | grep "$DEPLOY_DIR" | awk '{print $2}' | wc -l`
	
			if [ $COUNT -gt 0 ]; then
				break
			fi
	done
	echo "start OK!"
	PIDS=`ps  --no-heading -C java -f --width 1000 | grep "$DEPLOY_DIR" | awk '{print $2}'`
	echo "PID: $PIDS"
	
		
		
}

stop(){

		PIDS=`ps  --no-heading -C java -f --width 1000 | grep "$CONF_DIR" |awk '{print $2}'`
		if [ -z "$PIDS" ]; then
		    echo "ERROR: The $SERVER_NAME does not started!"
		fi
		
		echo -e "Stopping the $SERVER_NAME ...\c"
		for PID in $PIDS ; do
			kill $PID > /dev/null 2>&1
		done
		
		COUNT=0
		while [ $COUNT -lt 1 ]; do    
		    echo -e ".\c"
		    sleep 1
		    COUNT=1
		    for PID in $PIDS ; do
				PID_EXIST=`ps --no-heading -p $PID`
				if [ -n "$PID_EXIST" ]; then
					COUNT=0
					break
				fi
			done
		done
		echo "stop OK!"
		echo "PID: $PIDS"
		  
}

case $1 in
  start)
		start;
    ;;
  stop)
		stop;
    ;;
  restart)
		echo "############ Application of '"$MAIN_CLASS"' restarting....############"
    stop;
    sleep 1
    start;
    ;;
  *)
    echo "Usage: startup.sh {start|stop|restart}" 
    ;;
esac
exit 0