0
点赞
收藏
分享

微信扫一扫

java 启动脚支持自动复制最新文件和打印启动日志


#!/bin/sh
# ------------------------------------------------------------
# ./start.sh start 启动 stop 停止 restart 重启 status 状态
# 1、重新启动服务,并复制指定文件 app-1.0.0.jar 执行完成打印日志
# ./start.sh restart -c -l -f app-1.0.0.jar
# 2、参数说明
# -c 复制 version/中最新文件 到 APP_HOME 目录中
# -l 启动完成后打印日志
# -f 指定复制的文件名称,需要配合 -c 一起使用,否则没有任何作用
# 以上参数只对 restart 有效
#
# -----------------------------------------------------------


AppName=app-admin.jar

# JVM参数
JVM_OPTS="-Dname=$AppName  -Duser.timezone=Asia/Shanghai -Xms128m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError -XX:NewRatio=1 -XX:SurvivorRatio=30"
APP_HOME='/export/App/app-admin'
LOG_PATH=$APP_HOME/logs
LOG_FILE=$LOG_PATH/info.log

# 定义变量
CopyFileName=""
CopyFileFlag="false"
PrintLogFlag="false"

if [ "$1" = "" ];
then
    echo -e "\033[0;31m 未输入操作名 \033[0m  \033[0;34m {start|stop|restart|status} \033[0m"
    exit 1
fi

if [ "$AppName" = "" ];
then
    echo -e "\033[0;31m 未输入应用名 \033[0m"
    exit 1
fi

# 复制新发布的文件信息 -c filename
function copy_file()
{
    LASTEST_VERSION=$(find "$APP_HOME/version" -type f -printf '%T@ %p\n' | sort -nr | head -n 1 | awk '{print $2}')
    if [ "$1" != "" ];
    then
        LASTEST_VERSION = "$APP_HOME/version/$1"
    fi
    # 检测文件是否存在
    if [ ! -f "$LASTEST_VERSION" ]; then  
        echo "Error: $LASTEST_VERSION is not a file."  
        exit 1  
    fi  

    echo "复制文件 ${LASTEST_VERSION#"$APP_HOME/"} 到 $AppName"
    cp -f $LASTEST_VERSION $APP_HOME/$AppName
    echo "复制完成..."
}

function start()
{
    # 启动程序
    PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'`

    # 已启动,则直接退出
	if [ x"$PID" != x"" ]; then
	    echo "$AppName is running..."
        exit 1
	else
        # 复制文件
        if [ "$CopyFileFlag" = "true" ]; then
            copy_file "$CopyFileName"
        fi

        cd $APP_HOME
	    mkdir -p $LOG_PATH && touch $LOG_FILE && echo "" > $LOG_FILE
	    nohup java $JVM_OPTS -jar $APP_HOME/$AppName --spring.config.additional-location=$APP_HOME/config/ > $LOG_FILE 2>&1 &
		echo "Start $AppName success..."
        
        # 打印启动日志
        if [ "$PrintLogFlag" = "true" ]; then
            tail -f $LOG_FILE
        fi
	fi
}

function stop()
{
    echo "Stop $AppName"

	PID=""
	query(){
		PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'`
	}

	query
	if [ x"$PID" != x"" ]; then
		kill -9 $PID
		echo "$AppName (pid:$PID) exiting..."
		while [ x"$PID" != x"" ]
		do
			sleep 1
			query
		done
		echo "$AppName exited."
	else
		echo "$AppName already stopped."
	fi
}

function restart()
{
    stop
    sleep 2
    start
}

function status()
{
    PID=`ps -ef |grep java|grep $AppName|grep -v grep|wc -l`
    if [ $PID != 0 ];then
        echo "$AppName is running..."
    else
        echo "$AppName is not running..."
    fi
}

# 第一个参数为函数名
function_name=$1
# 参数前移1位,这时候 原$2 即为 新$1
shift

# 配置参数信息  -c #复制文件 -f filename 指定复制文件名,-l 打印日志
while getopts ":lcf:" opt; do
    case $opt in
        f)  # 复制指定文件
            CopyFileName="$OPTARG"
            ;;
        c)  # 复制最新文件
            CopyFileFlag="true"
            ;;
        l)  
            PrintLogFlag="true"
            ;;
        \?)  # 未知参数
            echo "Unknown option: -$OPTARG"
            exit 1
            ;;
    esac
done

case $function_name in
    start)
    start;;
    stop)
    stop;;
    restart)
    restart;;
    status)
    status;;
    *)
esac


举报

相关推荐

0 条评论