一、脚本
bash
#!/bin/bash
# 脚本名称:app-manager.sh
# 功能:Java应用启停管理脚本
# 使用方式:./app-manager.sh [start|stop|restart|status|logs|clean|help]
# ====================== 核心配置(必改)======================
APP_NAME="idiomatic-enligh-backend" # 应用名称(自定义)
JAR_FILE="idiomatic-enligh-backend-1.0.jar" # JAR包路径(绝对路径/相对路径)
LOG_DIR="./logs" # 日志目录
PID_FILE="./app.pid" # PID文件(记录进程ID)
# JVM参数
JAVA_OPTS="-Dfile.encoding=UTF-8 -Xms512m -Xmx512m"
# 日志清理配置(可按需调整)
LOG_BACKUP_DAYS=7 # 保留最近7天的日志备份
MAX_LOG_SIZE="100M" # 单日志文件最大大小(可选,用于切割提示)
# =============================================================
# 颜色定义(增强提示)
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # 重置颜色
# ========== 创建日志目录 ==========
mkdir -p ${LOG_DIR}
LOG_FILE="${LOG_DIR}/${APP_NAME}.log"
# ========== 检查Java环境 ==========
check_java() {
if ! command -v java &> /dev/null; then
echo -e "${RED}[ERROR] 未找到Java环境,请先安装JDK并配置环境变量!${NC}"
exit 1
fi
}
# ========== 检查JAR包是否存在 ==========
check_jar() {
if [ ! -f "${JAR_FILE}" ]; then
echo -e "${RED}[ERROR] JAR包不存在:${JAR_FILE},请检查配置!${NC}"
exit 1
fi
}
# ========== 检查进程是否运行 ==========
check_running() {
if [ -f ${PID_FILE} ]; then
PID=$(cat ${PID_FILE})
# 不仅检查PID是否存在,还验证是否是当前应用的进程
if ps -p ${PID} -o cmd= | grep -q "${JAR_FILE}"; then
return 0 # 运行中
else
rm -f ${PID_FILE} # PID文件无效,删除
return 1 # 未运行
fi
fi
return 1 # 未运行
}
# ========== 启动应用 ==========
start() {
# 前置检查
check_java
check_jar
if check_running; then
echo -e "${YELLOW}[${APP_NAME}] 应用已运行(PID:${PID})${NC}"
return
fi
echo -e "启动 [${APP_NAME}]..."
nohup java ${JAVA_OPTS} -jar ${JAR_FILE} > ${LOG_FILE} 2>&1 &
echo $! > ${PID_FILE}
# 等待2秒检查启动状态
sleep 2
if check_running; then
echo -e "${GREEN}[${APP_NAME}] 启动成功!${NC}"
echo -e "日志文件:${LOG_FILE}"
echo -e "进程PID:$(cat ${PID_FILE})"
else
echo -e "${RED}[${APP_NAME}] 启动失败!请查看日志:${LOG_FILE}${NC}"
rm -f ${PID_FILE}
fi
}
# ========== 停止应用 ==========
stop() {
if ! check_running; then
echo -e "${YELLOW}[${APP_NAME}] 应用未运行${NC}"
return
fi
echo -e "停止 [${APP_NAME}](PID:${PID})..."
kill ${PID} > /dev/null 2>&1
sleep 5
# 强制杀死残留进程
if ps -p ${PID} > /dev/null 2>&1; then
echo -e "强制停止进程..."
kill -9 ${PID} > /dev/null 2>&1
fi
rm -f ${PID_FILE}
echo -e "${GREEN}[${APP_NAME}] 已停止${NC}"
}
# ========== 查看状态 ==========
status() {
if check_running; then
echo -e "${GREEN}[${APP_NAME}] 运行中(PID:${PID})${NC}"
# 可选:显示日志文件大小
if [ -f ${LOG_FILE} ]; then
LOG_SIZE=$(du -h ${LOG_FILE} | awk '{print $1}')
echo -e "${BLUE}[INFO] 日志文件大小:${LOG_SIZE}(最大建议:${MAX_LOG_SIZE})${NC}"
fi
else
echo -e "${RED}[${APP_NAME}] 未运行${NC}"
fi
}
# 重启函数
restart() {
echo -e "重启 [${APP_NAME}]..."
stop
sleep 3
start
}
# ========== 实时查看日志 ==========
logs() {
if [ ! -f ${LOG_FILE} ]; then
echo -e "${YELLOW}[WARN] 日志文件不存在:${LOG_FILE}(应用可能未启动)${NC}"
return 1
fi
echo -e "${BLUE}[INFO] 实时查看${APP_NAME}日志(按 Ctrl+C 退出)...${NC}"
echo -e "${BLUE}[INFO] 日志文件:${LOG_FILE}${NC}"
# 实时跟踪日志,同时显示行号
tail -f -n 100 ${LOG_FILE}
}
# ========== 清理旧日志 ==========
clean() {
echo -e "${BLUE}[INFO] 开始清理${APP_NAME}旧日志(保留最近${LOG_BACKUP_DAYS}天)...${NC}"
# 清理日志目录下超过指定天数的日志文件(含备份/压缩包)
find ${LOG_DIR} -name "${APP_NAME}*.log*" -type f -mtime +${LOG_BACKUP_DAYS} -print | while read log; do
echo -e "${YELLOW}[INFO] 删除旧日志:${log}${NC}"
rm -f ${log}
done
# 检查是否有超大日志文件,给出提示
if [ -f ${LOG_FILE} ]; then
LOG_SIZE=$(du -b ${LOG_FILE} | awk '{print $1}')
MAX_SIZE=$(numfmt --from=iec ${MAX_LOG_SIZE})
if [ ${LOG_SIZE} -ge ${MAX_SIZE} ]; then
echo -e "${YELLOW}[WARN] 当前日志文件超过${MAX_LOG_SIZE},建议重启应用触发日志切割!${NC}"
fi
fi
echo -e "${GREEN}[SUCCESS] 旧日志清理完成!${NC}"
}
# ========== 查看帮助 ==========
help() {
echo -e "${BLUE}=============================================${NC}"
echo -e "${BLUE}${APP_NAME} 应用管理脚本 - 使用帮助${NC}"
echo -e "${BLUE}=============================================${NC}"
echo -e "${YELLOW}用法:${NC} ./app-manager.sh [命令]"
echo -e "${YELLOW}命令列表:${NC}"
echo -e " start - 启动应用(自动检查Java环境/JAR包)"
echo -e " stop - 停止应用(先优雅停止,超时强制杀死)"
echo -e " restart - 重启应用(先停止,再启动)"
echo -e " status - 查看应用运行状态(含日志文件大小)"
echo -e " logs - 实时查看应用日志(默认显示最后100行,Ctrl+C退出)"
echo -e " clean - 清理旧日志(保留最近${LOG_BACKUP_DAYS}天,删除过期日志)"
echo -e " help - 查看此帮助信息"
echo -e "${BLUE}=============================================${NC}"
}
# 脚本入口
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
logs)
logs
;;
clean)
clean
;;
help|--help|-h)
help
;;
*)
echo -e "${RED}使用错误!输入 ./app-manager.sh help 查看帮助${NC}"
exit 1
;;
esac
exit 0
二、使用方法
bash
# 安装dos2unix(CentOS/RHEL)
yum install -y dos2unix
# 转换脚本换行符
dos2unix app-manager.sh
# 赋予执行权限
chmod +x app-manager.sh
# 启动
./app-manager.sh start