← 목록
기타 2026-07-07 4KB 읽기 4분

Q감독 — 다중워커 감독자(Supervisor) 구축

개요

한선게이트웨이(crownyc VM, CROWNY_TCP_REUSEPORT=1 지원)를 위한 다중워커 상시유지 + 롤링재활용 감독자. 서브에이전트(Sonnet) 작업, 테스트 전용 포트(8084/8085)에서만 검증. 라이브(:8080/:8443/:9100) 무접촉.

산출물

  • /Users/ef/crowny-gateway/게이트웨이Q/Q감독.sh — bash 감독자(crownyc 기동/kill 주체라 bash 네이티브)
  • /Users/ef/crowny-gateway/게이트웨이Q/Q감독판정.한선 — 4상(티/옴/타/음) 판정 코어 (+ 컴파일된 .toau)

기능

  1. GWQ_WORKERS(기본 2)개 워커를 CROWNY_TCP_REUSEPORT=1 GW_WID=.wN GW_PORT=$GWQ_PORT로 기동(nohup+disown+stdin분리, 로그 append /tmp/gwq-worker-N.log). 워커 toau=GWQ_TOAU(기본 /tmp/gwlive.toau).
  2. 10초 주기 감시: state 디렉토리(/tmp/gwq-state-<PORT>/worker-N.pid|.started)로 슬롯 추적, kill -0으로 사망 판정 → 부족분 stagger 2s 보충.
  3. 롤링재활용: GWQ_RECYCLE_MIN(기본 60)분마다 가장 오래된 워커 1개 — 신워커 기동 → lsof LISTEN 폴링 확인(최대10s) → 확인되면 구워커 kill(무중단, 순간 N+1 허용). 미확인 시 신워커 롤백, 구워커 유지.
  4. /tmp/gw-restart.lock(mkdir+pid) 공유 — 게이트웨이재기동.sh/gwlive헬스워치독.sh와 상호배제, 락 점유중이면 이번 주기 양보(judge=음).
  5. Q감독.sh {run|stop|status} 서브커맨드. stop은 감독+전 워커 TERM(잔여 KILL)+state 정리, 라이브 게이트웨이 포트/락에 비침투(포트가 다르므로 별개 인스턴스).
  6. Q감독판정.한선: 입력(WORKER_COUNT/EXPECT_COUNT/RECENT_RESTARTS/LOCK_HELD 환경변수) → 출력 "상:사유" 한 줄. 매 주기 judge_and_log가 호출해 감독 로그에 기록(정본 표현으로 실제 배선, 장식 아님).

검증 (실행 로그 근거)

  • 컴파일: hanseonc_high Q감독판정.한선 → 181토큰/715큐브, exit0.
  • 유닛: WORKER/EXPECT/RECENT/LOCK 조합 5종 → 티:정상_2/2, 옴:보충중_1/2, 타:연속재기동과다_4회_5분내, 음:락점유_양보, 옴:재활용중_3/2(일시N+1) 전부 기대대로 출력.
  • 통합(포트8084, GWQ_TOAU=/tmp/gwq.toau, GWQ_WORKERS=2):
  • 기동 → status에 워커1/워커2 LISTEN 확인.
  • curl -H "Host: docs.crowny.org" http://127.0.0.1:8084/ → 200.
  • 워커1 kill(TERM) → 10~16초 내 워커1 자동 보충(신 PID, LISTEN 재확인) — 요구사항 충족.
  • stop → 감독+전 워커 종료, LISTEN 잔여 없음, /tmp/gw-restart.lock 잔여 없음.
  • 롤링재활용 별도검증(포트8085, GWQ_RECYCLE_MIN=0으로 즉시유발): 로그에 롤링재활용 대상: 워커1 age=12s워커3 기동 → LISTEN 확인 후 구워커1 kill 순서로 무중단 교체 확인(교체 중 LISTEN PID 2개 유지, 종료 후 다시 2개).
  • 라이브 무접촉 확인: 테스트 전/후 lsof :8080/:8443 PID 불변, curl -H Host:docs.crowny.org :8080/ = 200 유지. 테스트 프로세스는 전부 kill, /tmp/gw-restart.lock 없음.
  • 크라우니코드

    • 사전조회: crownycode-learn.sh search "감독 워커 재활용/supervisor watchdog worker/gw-restart lock mkdir" → 전부 MISS(신규 패턴).
    • lookup HIT 0건 / MISS 3건(신규 감독 로직) / learn 추가는 메인 세션이 필요 시 수행(서브에이전트는 검증까지, 학습DB 등록은 프로젝트 관례상 컴파일+런타임 검증된 산출물이므로 등록 권장).

    잔여 이슈

    • 실제 라이브 배선(org.crowny.gwhealth/게이트웨이재기동.sh를 Q감독으로 대체 또는 병행)은 메인 세션 판단 필요 — 이번 작업은 신규 도구 구축+테스트포트 검증까지.
    • launchd plist화(부팅 시 자동기동)는 미포함(요청 범위 밖).