게시판장기로 이해하는 규칙 엔진과 평가 함수 탐색예제 소스

예제 소스

장기로 이해하는 규칙 엔진과 평가 함수 탐색 · 파일 59개

install_janggy_launchd.sh

#!/usr/bin/env bash
# 장기(janggy) 웹을 launchd에 등록 — Next:3007 + 터널:18088 감시
set -euo pipefail

ROOT="$(cd "$(dirname "$0")/.." && pwd)"
UID_NUM="$(id -u)"
GUI="gui/$UID_NUM"
LA_DIR="$HOME/Library/LaunchAgents"
SUPPORT="${JANGGY_LAUNCHD_SUPPORT:-$HOME/Library/Application Support/Janggy}"
LOGS="${JANGGY_LAUNCHD_LOGS:-$HOME/Library/Logs/Janggy}"

if [[ -x /opt/homebrew/bin/python3 ]]; then
  PY=/opt/homebrew/bin/python3
elif command -v python3 >/dev/null 2>&1 && [[ "$(command -v python3)" != ~/project ]]; then
  PY="$(command -v python3)"
else
  echo "local python3 not found (/opt/homebrew/bin/python3)" >&2
  exit 1
fi

mkdir -p "$LA_DIR" "$SUPPORT" "$LOGS"
cp "$ROOT/scripts/daemon_janggy_stack_watchdog.py" "$SUPPORT/daemon_janggy_stack_watchdog.py"
DAEMON="$SUPPORT/daemon_janggy_stack_watchdog.py"

write_wrapper() {
  local name="$1"
  local script="$SUPPORT/$name.sh"
  local log="$LOGS/${name}.log"
  cat >"$script" <<EOF
#!/bin/zsh
set -euo pipefail
ROOT="$ROOT"
DAEMON="$DAEMON"
PY="$PY"
LOG="$log"
PATH_EXTRA="$HOME/.nvm/versions/node/v24.14.1/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"

mkdir -p "\$(dirname "\$LOG")"
cd "\$HOME"
export PYTHONUNBUFFERED=1
export PORT=3007
export JANGGY_ROOT="$ROOT"
export PATH="\$PATH_EXTRA"
exec "\$PY" "\$DAEMON" >>"\$LOG" 2>&1
EOF
  chmod +x "$script"
  echo "wrote $script"
}

write_plist() {
  local label="$1"
  local script="$2"
  local out="$LA_DIR/$label.plist"

  cat >"$out" <<EOF
<?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>/bin/zsh</string>
    <string>${script}</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>KeepAlive</key>
  <true/>
  <key>ThrottleInterval</key>
  <integer>15</integer>
  <key>SoftResourceLimits</key>
  <dict>
    <key>NumberOfFiles</key>
    <integer>4096</integer>
  </dict>
  <key>StandardOutPath</key>
  <string>${LOGS}/${label#com.janggy.}.stdout.log</string>
  <key>StandardErrorPath</key>
  <string>${LOGS}/${label#com.janggy.}.stderr.log</string>
</dict>
</plist>
EOF
  echo "wrote $out"
}

stop_label() {
  local label="$1"
  launchctl bootout "$GUI" "$LA_DIR/$label.plist" 2>/dev/null || true
}

start_label() {
  local label="$1"
  launchctl bootstrap "$GUI" "$LA_DIR/$label.plist"
  launchctl enable "$GUI/$label" 2>/dev/null || true
}

echo "== Janggy launchd install =="
echo "ROOT=$ROOT"
echo "PY=$PY"

pkill -f 'daemon_janggy_stack_watchdog.py' 2>/dev/null || true
sleep 1

write_wrapper run-stack-watchdog
write_plist com.janggy.stack-watchdog "$SUPPORT/run-stack-watchdog.sh"

stop_label com.janggy.stack-watchdog
start_label com.janggy.stack-watchdog

sleep 3
echo ""
echo "== launchd status =="
launchctl print "$GUI/com.janggy.stack-watchdog" 2>/dev/null | grep -E 'state =|pid =|last exit code' \
  || echo "com.janggy.stack-watchdog: not loaded"
echo ""
lsof -nP -iTCP:3007 -sTCP:LISTEN 2>/dev/null || echo ":3007 not listening yet"
echo ""
echo "상태: $LOGS/HEARTBEAT.md"
echo "로그: $LOGS/watchdog.log"