| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- #!/bin/bash
- # 地磅销售系统后端启动脚本
- # 使用方法: ./start.sh [start|stop|restart|status] 或 bash start.sh [start|stop|restart|status]
- # 注意: 此脚本需要使用 bash 运行,不要使用 sh start.sh
- # 检查是否使用 bash 运行
- if [ -z "$BASH_VERSION" ]; then
- echo "错误: 此脚本需要使用 bash 运行"
- echo "请使用以下命令之一:"
- echo " ./start.sh [command]"
- echo " bash start.sh [command]"
- exit 1
- fi
- set -e
- # 配置
- SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
- WORK_DIR="$SCRIPT_DIR"
- PID_FILE="$WORK_DIR/.dibang-backend.pid"
- LOG_FILE="$WORK_DIR/logs/dibang-backend.log"
- ENV_FILE="$WORK_DIR/.env.production"
- # 创建日志目录
- mkdir -p "$WORK_DIR/logs"
- # 查找 uv 可执行文件
- find_uv() {
- # 首先尝试从 PATH 中查找
- if command -v uv > /dev/null 2>&1; then
- echo "$(command -v uv)"
- return 0
- fi
-
- # 检查常见安装路径
- local uv_paths=(
- "/usr/local/bin/uv"
- "/usr/bin/uv"
- "$HOME/.cargo/bin/uv"
- "$HOME/.local/bin/uv"
- "/root/.cargo/bin/uv"
- "/root/.local/bin/uv"
- )
-
- for path in "${uv_paths[@]}"; do
- if [ -f "$path" ] && [ -x "$path" ]; then
- echo "$path"
- return 0
- fi
- done
-
- return 1
- }
- # 检查 uv 是否安装
- UV_CMD=$(find_uv)
- if [ -z "$UV_CMD" ]; then
- echo "错误: uv 未安装,请先安装 uv"
- echo "安装命令: curl -LsSf https://astral.sh/uv/install.sh | sh"
- exit 1
- fi
- echo "使用 uv: $UV_CMD"
- # 检查环境文件
- if [ ! -f "$ENV_FILE" ] && [ ! -f "$WORK_DIR/.env" ]; then
- echo "警告: 未找到环境配置文件 (.env.production 或 .env)"
- echo "将使用默认配置或环境变量"
- fi
- # 启动服务
- start() {
- if [ -f "$PID_FILE" ]; then
- PID=$(cat "$PID_FILE")
- if ps -p "$PID" > /dev/null 2>&1; then
- echo "服务已在运行中 (PID: $PID)"
- return 1
- else
- echo "清理过期的 PID 文件"
- rm -f "$PID_FILE"
- fi
- fi
- echo "正在启动后端服务..."
- cd "$WORK_DIR"
-
- # 设置环境变量
- export ENV=prod
- export PYTHONUNBUFFERED=1
- export UV_INDEX_URL="https://mirrors.aliyun.com/pypi/simple/"
- export UV_PUBLIC_PYPI_URL="https://mirrors.aliyun.com/pypi/simple/"
-
- # 使用 nohup 在后台启动
- nohup "$UV_CMD" run python app/main.py >> "$LOG_FILE" 2>&1 &
- PID=$!
-
- # 保存 PID
- echo $PID > "$PID_FILE"
-
- # 等待一下,检查进程是否还在运行
- sleep 2
- if ps -p "$PID" > /dev/null 2>&1; then
- echo "服务启动成功 (PID: $PID)"
- echo "日志文件: $LOG_FILE"
- echo "查看日志: tail -f $LOG_FILE"
- else
- echo "服务启动失败,请查看日志: $LOG_FILE"
- rm -f "$PID_FILE"
- return 1
- fi
- }
- # 停止服务
- stop() {
- if [ ! -f "$PID_FILE" ]; then
- echo "服务未运行(未找到 PID 文件)"
- return 1
- fi
-
- PID=$(cat "$PID_FILE")
- if ! ps -p "$PID" > /dev/null 2>&1; then
- echo "服务未运行(进程不存在)"
- rm -f "$PID_FILE"
- return 1
- fi
-
- echo "正在停止服务 (PID: $PID)..."
- kill "$PID"
-
- # 等待进程结束
- i=0
- while [ $i -lt 10 ]; do
- if ! ps -p "$PID" > /dev/null 2>&1; then
- break
- fi
- sleep 1
- i=$((i + 1))
- done
-
- # 如果还在运行,强制杀死
- if ps -p "$PID" > /dev/null 2>&1; then
- echo "强制停止服务..."
- kill -9 "$PID"
- fi
-
- rm -f "$PID_FILE"
- echo "服务已停止"
- }
- # 重启服务
- restart() {
- stop
- sleep 2
- start
- }
- # 查看状态
- status() {
- if [ ! -f "$PID_FILE" ]; then
- echo "服务未运行"
- return 1
- fi
-
- PID=$(cat "$PID_FILE")
- if ps -p "$PID" > /dev/null 2>&1; then
- echo "服务正在运行 (PID: $PID)"
- echo "日志文件: $LOG_FILE"
- return 0
- else
- echo "服务未运行(进程不存在)"
- rm -f "$PID_FILE"
- return 1
- fi
- }
- # 主逻辑
- case "${1:-}" in
- start)
- start
- ;;
- stop)
- stop
- ;;
- restart)
- restart
- ;;
- status)
- status
- ;;
- *)
- echo "使用方法: $0 {start|stop|restart|status}"
- exit 1
- ;;
- esac
- exit $?
|