#!/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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.