#!/bin/bash # 配置 APP_NAME="crawler" APP_DIR="/opt/app/crawler" VENV_DIR="$APP_DIR/venv" LOG_FILE="$APP_DIR/app.log" PID_FILE="$APP_DIR/app.pid" DISPLAY_NUM=":1" # 启动 start() { if [ -f "$PID_FILE" ] && kill -0 $(cat "$PID_FILE") 2>/dev/null; then echo "$APP_NAME 已经在运行 (PID: $(cat $PID_FILE))" return 1 fi echo "启动 $APP_NAME..." cd "$APP_DIR" source "$VENV_DIR/bin/activate" nohup env DISPLAY=$DISPLAY_NUM python -m uvicorn src.main:app --host 0.0.0.0 --port 8000 > "$LOG_FILE" 2>&1 & echo $! > "$PID_FILE" echo "$APP_NAME 已启动 (PID: $!)" } # 停止 stop() { if [ ! -f "$PID_FILE" ]; then echo "$APP_NAME 未运行" return 1 fi PID=$(cat "$PID_FILE") if kill -0 "$PID" 2>/dev/null; then echo "停止 $APP_NAME (PID: $PID)..." kill "$PID" rm -f "$PID_FILE" echo "$APP_NAME 已停止" else echo "$APP_NAME 未运行,清理 PID 文件" rm -f "$PID_FILE" fi } # 重启 restart() { stop sleep 2 start } # 状态 status() { if [ -f "$PID_FILE" ] && kill -0 $(cat "$PID_FILE") 2>/dev/null; then echo "$APP_NAME 运行中 (PID: $(cat $PID_FILE))" else echo "$APP_NAME 未运行" fi } # 查看日志 logs() { tail -f "$LOG_FILE" } # 使用说明 usage() { echo "用法: $0 {start|stop|restart|status|logs}" } # 主逻辑 case "$1" in start) start ;; stop) stop ;; restart) restart ;; status) status ;; logs) logs ;; *) usage ;; esac