通用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