#!/bin/bash # 福泉WebAPI 启动脚本 # 作者: Your Name # 版本: 1.0.0 # 应用配置 APP_NAME="福泉WebAPI" APP_JAR="webapi-1.0.0.jar" APP_PORT=8806 APP_CONTEXT_PATH="/fuquanapi" # JVM配置 JVM_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC -XX:+UseStringDeduplication" # 日志配置 LOG_DIR="./logs" LOG_FILE="$LOG_DIR/app.log" PID_FILE="./app.pid" # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 打印带颜色的消息 print_message() { local color=$1 local message=$2 echo -e "${color}[$(date '+%Y-%m-%d %H:%M:%S')] $message${NC}" } # 检查Java环境 check_java() { if ! command -v java &> /dev/null; then print_message $RED "错误: 未找到Java环境,请先安装JDK 1.8+" exit 1 fi JAVA_VERSION=$(java -version 2>&1 | head -n 1 | cut -d'"' -f2) print_message $BLUE "检测到Java版本: $JAVA_VERSION" } # 检查应用JAR文件 check_jar() { if [ ! -f "$APP_JAR" ]; then print_message $RED "错误: 未找到应用JAR文件: $APP_JAR" print_message $YELLOW "请确保在正确的目录下运行此脚本" exit 1 fi print_message $GREEN "找到应用JAR文件: $APP_JAR" } # 检查配置文件 check_config() { if [ -f "./application.yml" ]; then print_message $GREEN "找到外部配置文件: ./application.yml" print_message $BLUE "Spring Boot将自动使用外部配置文件" else print_message $YELLOW "未找到外部配置文件 ./application.yml,将使用JAR包内的默认配置" fi } # 创建日志目录 create_log_dir() { if [ ! -d "$LOG_DIR" ]; then mkdir -p "$LOG_DIR" print_message $BLUE "创建日志目录: $LOG_DIR" fi } # 检查应用是否已运行 check_running() { if [ -f "$PID_FILE" ]; then PID=$(cat "$PID_FILE") if ps -p $PID > /dev/null 2>&1; then print_message $YELLOW "应用已在运行中,PID: $PID" return 0 else print_message $YELLOW "发现无效的PID文件,正在清理..." rm -f "$PID_FILE" fi fi return 1 } # 启动应用 start_app() { print_message $BLUE "正在启动 $APP_NAME..." # 检查配置文件 check_config # 启动应用 nohup java $JVM_OPTS -jar "$APP_JAR" > "$LOG_FILE" 2>&1 & # 获取进程ID PID=$! echo $PID > "$PID_FILE" # 等待应用启动 print_message $BLUE "应用启动中,PID: $PID" sleep 3 # 检查应用是否成功启动 if ps -p $PID > /dev/null 2>&1; then print_message $GREEN "$APP_NAME 启动成功!" print_message $GREEN "访问地址: http://localhost:$APP_PORT$APP_CONTEXT_PATH" print_message $GREEN "API文档: http://localhost:$APP_PORT$APP_CONTEXT_PATH/swagger-ui.html" print_message $GREEN "日志文件: $LOG_FILE" print_message $GREEN "PID文件: $PID_FILE" else print_message $RED "应用启动失败,请检查日志文件: $LOG_FILE" rm -f "$PID_FILE" exit 1 fi } # 停止应用 stop_app() { if [ -f "$PID_FILE" ]; then PID=$(cat "$PID_FILE") if ps -p $PID > /dev/null 2>&1; then print_message $BLUE "正在停止 $APP_NAME (PID: $PID)..." kill $PID # 等待进程结束 for i in {1..30}; do if ! ps -p $PID > /dev/null 2>&1; then print_message $GREEN "$APP_NAME 已停止" rm -f "$PID_FILE" return 0 fi sleep 1 done # 强制杀死进程 print_message $YELLOW "应用未正常停止,正在强制终止..." kill -9 $PID rm -f "$PID_FILE" print_message $GREEN "$APP_NAME 已强制停止" else print_message $YELLOW "应用未在运行" rm -f "$PID_FILE" fi else print_message $YELLOW "未找到PID文件,应用可能未在运行" fi } # 重启应用 restart_app() { print_message $BLUE "正在重启 $APP_NAME..." stop_app sleep 2 start_app } # 查看应用状态 status_app() { if [ -f "$PID_FILE" ]; then PID=$(cat "$PID_FILE") if ps -p $PID > /dev/null 2>&1; then print_message $GREEN "$APP_NAME 正在运行,PID: $PID" print_message $GREEN "访问地址: http://localhost:$APP_PORT$APP_CONTEXT_PATH" else print_message $RED "$APP_NAME 未在运行(PID文件存在但进程不存在)" rm -f "$PID_FILE" fi else print_message $YELLOW "$APP_NAME 未在运行" fi } # 查看日志 view_logs() { if [ -f "$LOG_FILE" ]; then print_message $BLUE "显示最新日志 (最后50行):" echo "----------------------------------------" tail -n 50 "$LOG_FILE" echo "----------------------------------------" else print_message $YELLOW "日志文件不存在: $LOG_FILE" fi } # 显示帮助信息 show_help() { echo "福泉WebAPI 管理脚本" echo "" echo "用法: $0 {start|stop|restart|status|logs|help}" echo "" echo "命令:" echo " start - 启动应用" echo " stop - 停止应用" echo " restart - 重启应用" echo " status - 查看应用状态" echo " logs - 查看应用日志" echo " help - 显示此帮助信息" echo "" echo "配置:" echo " 应用JAR: $APP_JAR" echo " 端口: $APP_PORT" echo " 上下文路径: $APP_CONTEXT_PATH" echo " 日志文件: $LOG_FILE" } # 主函数 main() { case "$1" in start) check_java check_jar create_log_dir if check_running; then exit 0 fi start_app ;; stop) stop_app ;; restart) check_java check_jar create_log_dir restart_app ;; status) status_app ;; logs) view_logs ;; help|--help|-h) show_help ;; *) print_message $RED "错误: 未知命令 '$1'" echo "" show_help exit 1 ;; esac } # 执行主函数 main "$@"