接口优化

This commit is contained in:
lhx
2025-09-27 09:30:46 +08:00
parent 52d2753824
commit 0b1e9851dd
7 changed files with 368 additions and 384 deletions

169
start_daemon.sh Normal file
View File

@@ -0,0 +1,169 @@
#!/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