zhangrui.i
zhangrui.i
发布于 2024-06-21 / 7 阅读
0
0

Jar包 运维脚本

通用jar包运行脚本

#!/bin/bash

# 定义变量
JAR_NAME="sa-admin-prod-3.0.0.jar"
PARAMETER="-Dspring.profiles.active=prod"
LOG_FILE="/var/log/$JAR_NAME.log"
WAIT_TIMEOUT=60  # 最长等待 60 秒

# JVM 优化参数
JVM_OPTIONS="-Xms256m -Xmx512m -XX:+UseParallelGC -XX:ParallelGCThreads=2 -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -XX:+DisableExplicitGC"

# 检查进程是否在运行,返回进程ID
is_running() {
    pgrep -f "$JAR_NAME"
}

# 获取进程号
get_pid() {
    pgrep -f "$JAR_NAME"
}

# 停止函数,增加等待进程完全关闭的逻辑
stop() {
    local pids=$(is_running)
    if [ -n "$pids" ]; then
        echo "Stopping $JAR_NAME..."
        kill $pids

        # 轮询检查进程是否完全停止
        local count=0
        while [ $count -lt $WAIT_TIMEOUT ]; do
            if ! is_running; then
                echo "$JAR_NAME stopped successfully."
                return 0
            fi
            echo "Waiting for $JAR_NAME to stop..."
            sleep 1
            count=$((count + 1))
        done

        echo "Timeout: $JAR_NAME did not stop within $WAIT_TIMEOUT seconds."
        return 1
    else
        echo "$JAR_NAME is not running."
    fi
}

# 启动函数,等待进程完全启动
start() {
    if is_running; then
        echo "$JAR_NAME is already running."
    else
        echo "Starting $JAR_NAME..."
        nohup java $JVM_OPTIONS -jar $JAR_NAME $PARAMETER > $LOG_FILE 2>&1 &
        
        local count=0
        local timeout=60  # 最长等待 60 秒
        local port=1024  # 应用监听的端口

        while [ $count -lt $timeout ]; do
            if is_running; then
                echo "$JAR_NAME is starting... Checking port $port..."
                # 检查端口是否已经被监听
                if netstat -plnt | grep ":$port " > /dev/null; then
                    echo "$JAR_NAME started successfully on port $port."
                    return 0
                fi
            fi
            echo "Waiting for $JAR_NAME to fully start and open port $port..."
            sleep 2
            count=$((count + 2))
        done

        echo "Timeout: $JAR_NAME failed to start and open port $port within $timeout seconds."
        exit 1
    fi
}



# 重启函数,确保在旧进程完全停止后启动新进程
restart() {
    echo "Restarting $JAR_NAME..."
    stop
    if [ $? -eq 0 ]; then
        sleep 2  # 确保旧进程完全退出
        start
    else
        echo "Failed to stop $JAR_NAME, aborting restart."
        exit 1
    fi
}

# 状态检查函数
# 获取内存使用情况
get_mem_usage() {
    local pid=$(get_pid)
    if [ -n "$pid" ]; then
        ps -p $pid -o %mem | tail -1 | awk '{print $1"%"}'
    else
        echo "N/A"
    fi
}

# 获取CPU使用率
get_cpu_usage() {
    local pid=$(get_pid)
    if [ -n "$pid" ]; then
        ps -p $pid -o %cpu | tail -1 | awk '{print $1"%"}'
    else
        echo "N/A"
    fi
}

# 获取启动时间并格式化
get_start_time() {
    local pid=$(get_pid)
    if [ -n "$pid" ]; then
        local start_time=$(ps -p $pid -o lstart | tail -1)
        date -d "$start_time" +"%Y-%m-%d %H:%M:%S"
    else
        echo "N/A"
    fi
}

# 状态检查函数
status() {
    local pid=$(get_pid)
    local mem_usage=$(get_mem_usage)
    local cpu_usage=$(get_cpu_usage)
    local start_time=$(get_start_time)

    if [ -n "$pid" ]; then
        echo "$JAR_NAME is running."
        echo "PID: $pid"
        echo "Memory Usage: $mem_usage"
        echo "CPU Usage: $cpu_usage"
        echo "Start Time: $start_time"
    else
        echo "$JAR_NAME is not running."
    fi
}



# 根据输入参数执行相应操作
case "$1" in
    start)
        if [ -n "$2" ];then
            PARAMETER="$2"
        fi
        start
        ;;
    stop)
        stop
        ;;
    restart)
        if [ -n "$2" ];then
            PARAMETER="$2"
        fi
        restart
        ;;
    status)
        status
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|status} [parameter]"
        exit 1
        ;;
esac

exit 0

附件: run-pcey.sh


评论