Files
railway_cloud/start_daemon.sh
2025-09-27 10:46:09 +08:00

177 lines
4.5 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# 铁路项目管理系统 - 后台运行启动脚本
# 使用方法: ./start_daemon.sh [端口号]
# 默认端口: 8000
# 设置端口号默认为8000
PORT=${1:-3002}
# 设置日志文件路径
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"
# 临时添加.venv/bin到PATH
export PATH=$PATH:$(pwd)/.venv/bin
# 临时添加./cloud-bin-amd64/到PATH
export PATH=$PATH:$(pwd)/cloud-bin-amd64
# 激活虚拟环境
source .venv/bin/activate
# 创建日志目录
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