#!/bin/bash # 铁路项目管理系统 - 后台运行启动脚本 # 使用方法: ./start_daemon.sh [端口号] # 默认端口: 8000 # 设置端口号,默认为8000 PORT=${1:-8000} # 设置日志文件路径 LOG_DIR="logs" ACCESS_LOG="$LOG_DIR/access.log" ERROR_LOG="$LOG_DIR/error.log" APP_LOG="$LOG_DIR/app.log" PID_FILE="$LOG_DIR/app.pid" # 创建日志目录 mkdir -p "$LOG_DIR" echo "=== 铁路项目管理系统后台启动脚本 ===" echo "端口: $PORT" echo "日志目录: $LOG_DIR" # 清理端口函数 kill_process_on_port() { local port=$1 echo "检查端口 ${port} 的进程..." # Linux系统使用不同的命令查找占用端口的进程 if command -v lsof >/dev/null 2>&1; then # 使用lsof pid=$(lsof -ti :${port}) elif command -v netstat >/dev/null 2>&1; then # 使用netstat pid=$(netstat -tlnp 2>/dev/null | grep ":${port} " | awk '{print $7}' | cut -d'/' -f1) elif command -v ss >/dev/null 2>&1; then # 使用ss pid=$(ss -tlnp | grep ":${port} " | sed 's/.*pid=\([0-9]*\).*/\1/') else echo "警告: 无法找到 lsof、netstat 或 ss 命令,跳过端口检查" return fi if [ -n "$pid" ] && [ "$pid" != "" ]; then echo "发现端口 ${port} 被占用,PID: ${pid},正在杀死进程..." kill -9 $pid 2>/dev/null sleep 2 echo "已杀死端口 ${port} 的进程" else echo "端口 ${port} 未被占用" fi } # 停止已运行的服务函数 stop_service() { if [ -f "$PID_FILE" ]; then local old_pid=$(cat "$PID_FILE") if ps -p $old_pid > /dev/null 2>&1; then echo "停止已运行的服务 (PID: $old_pid)..." kill $old_pid sleep 3 if ps -p $old_pid > /dev/null 2>&1; then echo "强制停止服务..." kill -9 $old_pid fi fi rm -f "$PID_FILE" fi } # 检查Python环境 check_python() { if ! command -v python3 >/dev/null 2>&1; then echo "错误: 未找到 python3" exit 1 fi # 检查虚拟环境 if [ -d ".venv" ]; then echo "激活虚拟环境..." source .venv/bin/activate elif [ -d "venv" ]; then echo "激活虚拟环境..." source venv/bin/activate else echo "警告: 未找到虚拟环境,使用系统Python" fi } # 检查依赖 check_dependencies() { echo "检查依赖包..." python3 -c "import fastapi, uvicorn" 2>/dev/null if [ $? -ne 0 ]; then echo "错误: 缺少必要的依赖包 (fastapi, uvicorn)" echo "请运行: pip install -r requirements.txt" exit 1 fi } # 主函数 main() { # 停止已运行的服务 stop_service # 清理端口 kill_process_on_port $PORT # 检查环境 check_python check_dependencies echo "启动服务..." echo "启动时间: $(date)" > "$APP_LOG" echo "端口: $PORT" >> "$APP_LOG" echo "=================================" >> "$APP_LOG" # 后台启动服务 nohup python3 -m uvicorn app.main:app \ --host 0.0.0.0 \ --port $PORT \ --access-log \ --log-level info \ >> "$APP_LOG" 2>&1 & # 保存PID echo $! > "$PID_FILE" # 等待服务启动 sleep 3 # 检查服务是否启动成功 if ps -p $(cat "$PID_FILE") > /dev/null 2>&1; then echo "✅ 服务启动成功!" echo "🌐 访问地址: http://localhost:$PORT" echo "📖 API文档: http://localhost:$PORT/docs" echo "📋 ReDoc文档: http://localhost:$PORT/redoc" echo "📄 日志文件: $APP_LOG" echo "🔍 进程ID: $(cat $PID_FILE)" echo "" echo "查看日志: tail -f $APP_LOG" echo "停止服务: ./stop.sh 或 kill $(cat $PID_FILE)" # 创建停止脚本 cat > stop.sh << EOF #!/bin/bash if [ -f "$PID_FILE" ]; then PID=\$(cat "$PID_FILE") echo "停止服务 (PID: \$PID)..." kill \$PID rm -f "$PID_FILE" echo "服务已停止" else echo "未找到运行中的服务" fi EOF chmod +x stop.sh else echo "❌ 服务启动失败,请查看日志: $APP_LOG" exit 1 fi } # 捕获退出信号 trap 'echo "脚本被中断"; exit 1' INT TERM # 运行主函数 main