autotrain/scripts/install_web_ui_launch_agent.sh
xinxin6623 137eaed2af feat: improve web ui automation runner
Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-12 00:42:20 +08:00

79 lines
2.2 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
PORT="${WEB_UI_PORT:-8765}"
LABEL="com.james.autotrain.web-ui"
PLIST="$HOME/Library/LaunchAgents/$LABEL.plist"
LOG_FILE="$ROOT_DIR/work/web_ui.log"
PID_FILE="$ROOT_DIR/work/web_ui.pid"
LAUNCHD_TARGET="gui/$(id -u)/$LABEL"
PYTHON_BIN="$(python3 -c 'import sys; print(sys.executable)')"
mkdir -p "$ROOT_DIR/work" "$HOME/Library/LaunchAgents"
echo "[web-ui] project: $ROOT_DIR"
echo "[web-ui] python: $PYTHON_BIN"
echo "[web-ui] installing launch agent: $PLIST"
launchctl bootout "gui/$(id -u)" "$PLIST" >/dev/null 2>&1 || true
PIDS="$(lsof -tiTCP:"$PORT" -sTCP:LISTEN 2>/dev/null || true)"
if [[ -n "$PIDS" ]]; then
echo "[web-ui] stopping old listener on :$PORT -> $PIDS"
kill $PIDS 2>/dev/null || true
sleep 1
fi
cat > "$PLIST" <<PLIST
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>$LABEL</string>
<key>ProgramArguments</key>
<array>
<string>$PYTHON_BIN</string>
<string>-u</string>
<string>$ROOT_DIR/scripts/web_ui.py</string>
</array>
<key>WorkingDirectory</key>
<string>$ROOT_DIR</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>$LOG_FILE</string>
<key>StandardErrorPath</key>
<string>$LOG_FILE</string>
<key>EnvironmentVariables</key>
<dict>
<key>PYTHONUNBUFFERED</key>
<string>1</string>
</dict>
</dict>
</plist>
PLIST
launchctl bootstrap "gui/$(id -u)" "$PLIST"
launchctl kickstart -k "$LAUNCHD_TARGET"
for _ in {1..30}; do
if curl -fsS --max-time 2 "http://127.0.0.1:$PORT/" >/dev/null; then
PID="$(lsof -tiTCP:"$PORT" -sTCP:LISTEN 2>/dev/null | head -n 1 || true)"
[[ -n "$PID" ]] && echo "$PID" > "$PID_FILE"
echo "[web-ui] ready: http://127.0.0.1:$PORT"
echo "[web-ui] managed by: $LABEL"
echo "[web-ui] pid: ${PID:-unknown}"
echo "[web-ui] log: $LOG_FILE"
exit 0
fi
sleep 0.2
done
echo "[web-ui] launch agent startup timeout. log: $LOG_FILE" >&2
tail -80 "$LOG_FILE" >&2 || true
exit 1