이전 메시지 불러오는 중…
변우석의 요청:
[사고 재발방지 검증 — 짧게 부탁] 제 부트스트랩이 daemon을 강제 kill해서 ~30초 다운됐습니다. 원인: run.bat이 `node daemon.js` 종료 후 `timeout /t 30` 후 재기동 → 강제kill+30초 공백+진행태스크 중단. 이 30초 공백은 버튼(graceful) 재시작에도 동일 적용되는 게 핵심 문제입니다.
재발방지로 run.bat을 다음과 같이 수정했습니다(파일만 수정, 프로세스 안 건드림):
```
node daemon.js
if %ERRORLEVEL%==0 ( timeout /t 3 ) else ( timeout /t 15 ) ; graceful=3초, 크래시=15초 백오프
goto loop
```
3가지만 확인해주세요(짧게):
1. daemon이 restart-graceful/버튼/.shutdown 경로로 종료할 때 실제 exit code가 0인지? (0이 아니면 위 분기에서 graceful도 15초 백오프 타니 조정 필요)
2. run.bat 파일 수정이 현재 실행 중 cmd(27976)의 다음 loop부터 자동 반영되는지(추가 재시작 불필요한지)?
3. 진행 중 태스크 중단 없이 graceful 재시작이 보장되는지 + 버튼 재시작 공백을 더 줄일 방법이 있으면 한 줄.
확인 끝났습니다. 결론부터.
1. graceful 종료 exit code → 전부 0, 분기 정상
세 경로 모두 같은 지점(daemon.js:1877)으로 수렴해 process.exit(0)로 끝납니다.
| 경로 | 동작 | exit |
|---|---|---|
버튼/restart-graceful (line 1572) |
.shutdown 플래그만 드롭 → return |
— |
.shutdown 플래그 (메인루프 1873) |
진행 태스크 드레인 후 idle 되면 exit(0) |
0 |
restart (즉시 respawn, 1555) |
자식 spawn 후 exit(0) |
0 |
| 크래시 (329, 959) | process.exit(1) |
1 |
→ graceful=3초 / 크래시=15초 분기 의도대로 동작합니다. 조정 불필요.
주의: 버튼 재시작은 restart-graceful → 플래그 드롭 → 메인루프가 드레인 → exit(0) 경로입니다. 강제 kill이 끼는 단계가 없습니다.
2. run.bat 수정 → 다음 loop부터 반영 (단, 결정적 검증 권장)
cmd.exe는 배치 파일을 메모리에 통째로 안 올리고 바이트 오프셋 기준으로 디스크에서 줄 단위로 다시 읽습니다. goto loop가 파일을 다시 스캔하므로, 현재 node daemon.js가 끝나고 다음 루프를 돌 때 수정본이 적용됩니다. cmd(27976) 추가 재시작 불필요.
다만 실행 중 배치 편집은 오프셋이 틀어지면 깨질 수 있는 알려진 fragile 동작이라 "100%"라고 단정하진 않겠습니다. 다음 재시작 때 콘솔에 [lax-daemon] graceful exit, restarting in 3s가 찍히는지 눈으로 1건 확인하면 결정적으로 검증됩니다(자가 DONE 대신).
3. 태스크 중단 / 공백 추가 단축
- graceful 재시작 시 진행 태스크 중단 없음 — 보장됨. 메인루프(1873~1881)가
activeRuns가 0이 될 때까지 1.5초씩 드레인하며 새 작업 리스를 멈추고, 다 끝난 뒤에만 exit합니다. 이번 사고의 원인이던 강제 kill 단계가 graceful 경로엔 없습니다. - 공백 더 줄이기 (한 줄):
timeout /t 3→/t 1로 낮추면 됩니다. 진짜 무공백을 원하면 즉시-respawn하는restart명령(1555)이 종료 전 후임을 먼저 띄우지만, 그건 드레인을 안 해서(400ms 후 exit) 진행 태스크를 자릅니다 — 무중단이 우선이면 건드리지 말고 3→1초가 안전한 절충입니다.
참고(수정 안 함, 보고만): daemon.js:1574~1577 주석이 옛 run.bat 동작("exit → 30s → relaunch")을 그대로 설명하고 있어 이번 수정과 불일치합니다. 다음에 daemon 손댈 때 같이 정리하면 됩니다.
전체적으로 수정 방향 타당하고 롤백도 run.bat 한 줄 revert로 즉시 가능합니다.