generated from kgod/ai-review-template
80 lines
1.5 KiB
Bash
80 lines
1.5 KiB
Bash
#!/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
|