이전 메시지 불러오는 중…
박보검의 요청:
[daemon 자가회생 대책 구현 요청 — Jason 지시]
문제: daemon이 완전히 죽으면(supervisor까지) Jason이 할 수 있는 게 run.bat 더블클릭뿐. Jason은 더 확실한 대책을 원해. 클라우드 설정버튼은 로컬 죽은 프로세스를 못 켜는 게 근본 제약(클라우드→로컬 콜드스타트 불가)이라, "버튼"이 아니라 "OS레벨 자가회생"으로 풀어야 한다고 봐. 네 소관이니 설계+구현해줘.
요청:
1. **OS 레벨 자동 회생** 구현: Windows 작업 스케줄러(또는 서비스/nssm)로 daemon supervisor를 ① 로그온 시 자동 시작 ② 크래시/종료 시 자동 재시작 되게. supervisor까지 죽어도 OS가 수초 내 되살리도록. → 이게 되면 "죽은 채 방치" 시나리오 자체가 사라짐.
2. **즉시 폴백**: 바탕화면에 원클릭 단축아이콘(run.bat 또는 start-hidden.vbs 가리키게) 생성 — 급할 때 Jason이 한 번 클릭으로 회생.
3. 각각 **실제로 구현**하고(추측/제안만 말고), Jason이 어떻게 동작 확인하는지 + 롤백법을 알려줘. 작업 스케줄러 등록명/트리거, 단축아이콘 경로 명시.
4. 비가역/위험 요소 있으면(자동시작 등록 등) 그 부분만 따로 표시 — Jason 최종확인 받게.
주의: 이번 작업으로 daemon을 죽이지 마. 현재 단일 인스턴스 정상 상태 유지하면서 등록만. 진행상황 동봉해서, 뭘 했고 뭐가 남았는지 단계로 보고해줘. (참고: 너는 호출마다 무상태라 직전 맥락 기억 못 하니, 이 메시지 안에서 자기완결로 처리)
완료했습니다. 결론부터 보고합니다.
[무엇을 바꿨나]
| # | 항목 | 내용 |
|---|---|---|
| 1 | OS 레벨 자동 회생 | 작업 스케줄러 작업 LAXDaemon 신규 등록 |
| 2 | reconciler 스크립트 | C:\Users\user\LAX-site\daemon\ensure-daemon.ps1 (신규) |
| 3 | 작업 정의 백업 | daemon\LAXDaemon.task.xml (재등록용 원본) |
| 4 | 즉시 폴백 | 바탕화면 단축아이콘 LAX 데몬 켜기 (비상).lnk → start-hidden.vbs |
핵심 발견: 기존 WikicomuDaemon 작업은 LAX가 아니라 다른 프로젝트(Wikicomu-site)를 가리키고 있었습니다. 즉 LAX daemon을 보호하는 OS 회생은 아예 없었습니다. 이번에 LAX 전용으로 새로 만들었습니다.
[왜 — 3계층 회생 모델]
- L1 프로세스 크래시 → run.bat 내부 루프가 3~15초 내 재시작 (기존, 그대로).
- L2 로그온/재부팅 →
LAXDaemon의 LogonTrigger가 즉시 시작. - L3 supervisor(run.bat)까지 사망 →
LAXDaemon의 1분 주기 reconciler가 감지·재기동. ← 이전엔 비어 있던 "죽은 채 방치" 구멍. - reconciler는 멱등 + 유예마커: 죽은 걸 처음 보면 마커만 남겨 run.bat에게 살릴 시간을 주고, 다음 틱(≥60초)에도 죽어 있을 때만(=supervisor 진짜 사망) 재기동 → 정상 크래시와의 중복 supervisor 충돌 방지. daemon의 원자적 단일 인스턴스 락이 최종 안전망.
- LAX 식별은 lock PID로 정밀 판별(Wikicomu daemon도
node daemon.js라 명령줄만으론 구분 불가).
[검증 결과 — 자가 DONE 아님, 라이브/격리 실측]
검증 중 버그 2개를 잡아 고쳤습니다(그래서 검증이 의미 있었습니다):
- 락 PID 파싱 버그(
Get-Content가 단일 라인을 스칼라로 반환 → 첫 문자만 읽힘) → 항상 "DOWN" 오판.-Raw + TryParse로 수정. - 그 오판이 일시적으로 띄운 orphan run.bat(PID 19300)을 탐지·정리 완료(원본 supervisor 19500·daemon 36256 무손상).
수정 후 실측:
- healthy 경로(실제 스케줄러 실행 ×3): LastTaskResult=0, 로그 0줄 추가(오판 없음), 마커 없음, daemon PID 36256 불변, 새 orphan 없음.
- DOWN→relaunch 상태머신(격리 샌드박스, 라이브 무영향): run1=마커 생성·재기동 안 함 / run2=재기동 분기 실행·마커 해제 / run3(alive)=무동작. 로그로 결정적 확인.
- 최종:
LAXDaemonState=Ready, NextRunTime=13:17(1분 주기 가동 중), 단일 daemon 유지. 작업 중 daemon 안 죽였습니다.
Jason 동작 확인법 (택1): 작업 스케줄러에서 LAXDaemon 우클릭→실행 후 daemon 온라인 유지 확인 / 또는 daemon\ensure-daemon.log가 정상 시 조용한지 확인. 진짜 회생 테스트는 run.bat 콘솔을 강제 종료해 보면 12분 내 자동 부활합니다.
⚠️ [비가역/위험 — Jason 최종확인 요청]
LAXDaemon로그온 자동시작 등록: 이 PC가 로그인될 때마다 LAX daemon이 자동 기동됩니다(부팅 동작 변경). 안전하게 설계했고(락 가드+유예마커로 중복 없음) 라이브 검증했지만, 자동시작 자체를 원치 않으시면 알려주세요. 완전 가역입니다.
[롤백 방법]
# 작업 제거 (자동 회생 해제)
Unregister-ScheduledTask -TaskName 'LAXDaemon' -Confirm:$false
# 파일 제거
Remove-Item 'C:\Users\user\LAX-site\daemon\ensure-daemon.ps1','C:\Users\user\LAX-site\daemon\LAXDaemon.task.xml' -Force
Remove-Item 'C:\Users\user\Desktop\LAX 데몬 켜기 (비상).lnk' -Force
→ 롤백해도 기존 run.bat 루프는 그대로라 현 daemon은 계속 동작합니다(이번 변경은 daemon.js·런타임 코드 무수정, 순수 추가물).
[남은 것 / 참고]
- 신규 파일 2개는 git untracked 상태로 뒀습니다(
daemon/ensure-daemon.ps1,daemon/LAXDaemon.task.xml). 정본화 원하시면 커밋하겠습니다. - (불요 수정 안 함, 보고만) 기존
RUNBOOK-emergency-recovery.md는 복구 경로로WikicomuDaemon을 언급하는데 그건 다른 프로젝트 작업입니다 — LAX는 이제LAXDaemon. 원하시면 런북을 LAX 기준으로 갱신하겠습니다.