feat(app): 添加 snailjob-server 应用的管理脚本- 新增 run.sh 脚本,实现应用的启动、停止、重启、状态检查、日志查看、备份和升级功能

- 脚本支持 Java环境检查、应用目录和 JAR 文件存在性检查
- 实现了日志轮转、优雅停止和强制终止等高级功能- 备份和升级功能考虑了旧版本的保留和新版本的替换
This commit is contained in:
hsc 2025-04-26 18:18:03 +08:00
parent 6ce4550518
commit d6415babee
1 changed files with 293 additions and 0 deletions

293
app/run.sh Normal file
View File

@ -0,0 +1,293 @@
#!/bin/bash
# ==============================================
# Java应用管理脚本 v2.0
# 功能:启动/停止/重启/状态检查/日志查看/升级/备份
# ==============================================
# --------------------------
# 配置区(请根据实际情况修改)
# --------------------------
APP_NAME="snailjob-server" # 应用名称
APP_DIR="../lib" # 应用目录(支持绝对路径)
JAR_NAME="ruoyi-snailjob-server.jar" # JAR文件名
JAVA_OPTS="-Xms256m -Xmx512m -XX:+UseG1GC -Dfile.encoding=UTF-8" # JVM参数
LOG_FILE="${APP_DIR}/app.log" # 日志文件路径
PID_FILE="${APP_DIR}/app.pid" # PID文件路径
MAX_LOG_SIZE=10 # 日志轮转大小(MB)
BACKUP_DIR="${APP_DIR}/backup" # 备份目录
WAIT_STOP_TIMEOUT=30 # 停止等待超时(秒)
# --------------------------
# 初始化检查
# --------------------------
init_check() {
# 检查Java环境
if ! command -v java &> /dev/null; then
echo "[ERROR] Java未安装请先安装JDK"
exit 1
fi
# 检查目录是否存在
if [ ! -d "$APP_DIR" ]; then
echo "[ERROR] 应用目录不存在: $APP_DIR"
exit 1
fi
# 检查JAR文件是否存在
if [ ! -f "${APP_DIR}/${JAR_NAME}" ]; then
echo "[ERROR] JAR文件不存在: ${APP_DIR}/${JAR_NAME}"
exit 1
fi
# 创建备份目录
mkdir -p "$BACKUP_DIR"
}
# --------------------------
# 日志轮转
# --------------------------
rotate_log() {
if [ -f "$LOG_FILE" ]; then
log_size=$(du -m "$LOG_FILE" | cut -f1)
if [ "$log_size" -gt "$MAX_LOG_SIZE" ]; then
echo "正在轮转日志文件..."
timestamp=$(date +%Y%m%d%H%M%S)
mv "$LOG_FILE" "${LOG_FILE}.$timestamp"
gzip "${LOG_FILE}.$timestamp" -f
mv "${LOG_FILE}.$timestamp.gz" "$BACKUP_DIR/"
touch "$LOG_FILE"
fi
fi
}
# --------------------------
# 获取应用状态
# --------------------------
status() {
if [ -f "$PID_FILE" ]; then
pid=$(cat "$PID_FILE")
if ps -p "$pid" > /dev/null; then
echo "[INFO] $APP_NAME 正在运行 (PID: $pid)"
return 0
else
echo "[WARN] PID文件存在但进程未运行可能存在异常退出"
return 1
fi
else
echo "[INFO] $APP_NAME 未运行"
return 3
fi
}
# --------------------------
# 启动应用
# --------------------------
start() {
init_check
status >/dev/null 2>&1
local running=$?
if [ $running -eq 0 ]; then
echo "[WARN] $APP_NAME 已经在运行中 (PID: $(cat "$PID_FILE"))"
return 1
fi
# 清理无效PID文件
if [ $running -eq 1 ]; then
rm -f "$PID_FILE"
fi
rotate_log
echo "正在启动 $APP_NAME..."
cd "$APP_DIR" || exit 1
# 使用exec启动以便获取正确的PID
nohup java $JAVA_OPTS -jar "$JAR_NAME" >> "$LOG_FILE" 2>&1 &
local pid=$!
echo $pid > "$PID_FILE"
echo "[SUCCESS] $APP_NAME 已启动 (PID: $pid)"
echo "日志文件: $LOG_FILE"
}
# --------------------------
# 停止应用
# --------------------------
stop() {
status >/dev/null 2>&1
local running=$?
if [ $running -ne 0 ]; then
echo "[WARN] $APP_NAME 未运行"
return 1
fi
local pid=$(cat "$PID_FILE")
echo "正在停止 $APP_NAME (PID: $pid)..."
# 先尝试优雅关闭
kill $pid
# 等待进程退出
local count=0
while [ $count -lt $WAIT_STOP_TIMEOUT ]; do
if ! ps -p $pid > /dev/null; then
break
fi
sleep 1
((count++))
done
# 强制终止
if ps -p $pid > /dev/null; then
echo "[WARN] 优雅关闭失败,尝试强制终止..."
kill -9 $pid
sleep 1
fi
rm -f "$PID_FILE"
echo "[SUCCESS] $APP_NAME 已停止"
}
# --------------------------
# 重启应用
# --------------------------
restart() {
stop
sleep 2
start
}
# --------------------------
# 查看日志
# --------------------------
tail_log() {
if [ ! -f "$LOG_FILE" ]; then
echo "[ERROR] 日志文件不存在: $LOG_FILE"
return 1
fi
echo "正在显示日志: $LOG_FILE (Ctrl+C 退出)"
echo "--------------------------------------------------"
tail -f "$LOG_FILE"
}
# --------------------------
# 备份应用
# --------------------------
backup() {
local timestamp=$(date +%Y%m%d%H%M%S)
local backup_file="${BACKUP_DIR}/${JAR_NAME%.*}_${timestamp}.jar"
echo "正在备份应用到: $backup_file"
cp "${APP_DIR}/${JAR_NAME}" "$backup_file"
if [ $? -eq 0 ]; then
echo "[SUCCESS] 备份完成"
return 0
else
echo "[ERROR] 备份失败"
return 1
fi
}
# --------------------------
# 升级应用
# --------------------------
upgrade() {
local new_jar="$JAR_NAME"
local lib_dir="$APP_DIR"
local backup_dir="${BACKUP_DIR}/lib"
# 检查新的JAR文件是否存在
if [ ! -f "$new_jar" ]; then
echo "[ERROR] 新的JAR文件不存在: $new_jar"
return 1
fi
# 检查lib目录是否存在
if [ ! -d "$lib_dir" ]; then
echo "[ERROR] lib目录不存在: $lib_dir"
return 1
fi
# 检查backup目录是否存在不存在则创建
mkdir -p "$backup_dir"
# 获取lib目录下原有的JAR文件名
local old_jar=$(ls "$lib_dir" | grep -E "^${JAR_NAME%.jar}-[0-9]{14}\.jar$")
if [ -z "$old_jar" ]; then
old_jar="$JAR_NAME"
fi
# 备份原有的JAR文件
local timestamp=$(date +%Y%m%d%H%M%S)
local backup_file="${backup_dir}/${old_jar%.jar}_${timestamp}.jar"
cp "${lib_dir}/${old_jar}" "$backup_file"
if [ $? -eq 0 ]; then
echo "[SUCCESS] 备份原有JAR文件到: $backup_file"
else
echo "[ERROR] 备份原有JAR文件失败"
return 1
fi
# 复制新的JAR文件到lib目录
cp "$new_jar" "$lib_dir/"
if [ $? -eq 0 ]; then
echo "[SUCCESS] 升级JAR文件到: $lib_dir/$new_jar"
else
echo "[ERROR] 升级JAR文件失败"
return 1
fi
# 删除旧的JAR文件可选如果保留旧版本则不需要删除
# rm -f "${lib_dir}/${old_jar}"
# if [ $? -eq 0 ]; then
# echo "[SUCCESS] 删除旧的JAR文件: ${lib_dir}/${old_jar}"
# else
# echo "[ERROR] 删除旧的JAR文件失败"
# return 1
# fi
}
# --------------------------
# 主程序
# --------------------------
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
log)
tail_log
;;
backup)
backup
;;
upgrade)
upgrade
;;
*)
echo "用法: $0 {start|stop|restart|status|log|backup|upgrade}"
echo " start 启动应用"
echo " stop 停止应用"
echo " restart 重启应用"
echo " status 查看状态"
echo " log 查看实时日志"
echo " backup 备份应用"
echo " upgrade 升级应用"
exit 1
;;
esac
exit 0