Files
AI_A4000/video_worker/scripts/start_edge_device_local.sh
2026-04-07 17:01:13 +08:00

90 lines
2.6 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT_DIR"
ENV_FILE="${ENV_FILE:-.env}"
ENV_TEMPLATE_FILE="${ENV_TEMPLATE_FILE:-.env.example}"
EDGE_RUNTIME_DIR="${EDGE_RUNTIME_DIR:-runtime}"
PID_DIR="${EDGE_RUNTIME_DIR}/pids"
LOG_DIR="${EDGE_RUNTIME_DIR}/logs"
WORKER_PID_FILE="${PID_DIR}/worker.pid"
EDGE_CLIENT_PID_FILE="${PID_DIR}/edge_client.pid"
WORKER_LOG="${LOG_DIR}/worker.log"
EDGE_CLIENT_LOG="${LOG_DIR}/edge_client.log"
mkdir -p "$PID_DIR" "$LOG_DIR"
if [ ! -f "$ENV_FILE" ]; then
cp "$ENV_TEMPLATE_FILE" "$ENV_FILE"
echo "[INFO] ${ENV_FILE} missing, created from ${ENV_TEMPLATE_FILE}"
fi
if [ ! -d .venv ]; then
echo "[INFO] .venv missing, running install script"
bash scripts/install_wsl_env.sh
fi
source .venv/bin/activate
set -a
source "$ENV_FILE"
set +a
# Edge device must not expose ingress service to external network.
# Force localhost bind even if APP_HOST is configured differently.
APP_HOST="127.0.0.1"
APP_PORT="${APP_PORT:-8000}"
DISPATCH_WS_URL="${DISPATCH_WS_URL:-}"
WORKER_BASE_URL="${WORKER_BASE_URL:-http://127.0.0.1:${APP_PORT}}"
EDGE_POLL_INTERVAL_SEC="${EDGE_POLL_INTERVAL_SEC:-1.0}"
if [ -z "${DISPATCH_WS_URL}" ]; then
echo "[ERROR] DISPATCH_WS_URL is empty"
echo "[INFO] set DISPATCH_WS_URL in .env, e.g. ws://<center-host>:8060/ws/edge/<device-id>"
exit 1
fi
is_running() {
local pid_file="$1"
if [ ! -f "$pid_file" ]; then
return 1
fi
local pid
pid="$(cat "$pid_file" 2>/dev/null || true)"
if [ -z "$pid" ]; then
return 1
fi
if kill -0 "$pid" >/dev/null 2>&1; then
return 0
fi
return 1
}
if is_running "$WORKER_PID_FILE"; then
echo "[INFO] worker already running (pid $(cat "$WORKER_PID_FILE"))"
else
nohup python -m uvicorn app.main:app --host "$APP_HOST" --port "$APP_PORT" >"$WORKER_LOG" 2>&1 &
echo $! >"$WORKER_PID_FILE"
echo "[OK] worker started (pid $(cat "$WORKER_PID_FILE"))"
fi
if is_running "$EDGE_CLIENT_PID_FILE"; then
echo "[INFO] edge client already running (pid $(cat "$EDGE_CLIENT_PID_FILE"))"
else
nohup env \
DISPATCH_WS_URL="$DISPATCH_WS_URL" \
WORKER_BASE_URL="$WORKER_BASE_URL" \
EDGE_POLL_INTERVAL_SEC="$EDGE_POLL_INTERVAL_SEC" \
python scripts/edge_device_client.py >"$EDGE_CLIENT_LOG" 2>&1 &
echo $! >"$EDGE_CLIENT_PID_FILE"
echo "[OK] edge client started (pid $(cat "$EDGE_CLIENT_PID_FILE"))"
fi
echo "[INFO] worker health: curl http://127.0.0.1:${APP_PORT}/health"
echo "[INFO] dispatch ws: ${DISPATCH_WS_URL}"
echo "[INFO] worker base url for client: ${WORKER_BASE_URL}"
echo "[INFO] worker log: ${WORKER_LOG}"
echo "[INFO] edge client log: ${EDGE_CLIENT_LOG}"