leum ERP 세션복구 — 워치독 lsof PATH 오판 근본수정
개요
재부팅(win125 세션)으로 중단된 leum.crowny.org(이음미디어 ERP, erp.crowny.org 테넌트) 작업 복구.
결론:
leum 서비스 자체는 내내 정상 작동 중이었고, 실제 결함은 테넌트 워치독의 lsof 오판 버그였다. 근본수정 완료.
진단 경위 (반전의 연속)
- 초기 점검:
lsof -sTCP:LISTEN이 9940 "DOWN" 보고 → 죽은 줄 알고 재기동 시도.
- 하지만 로컬·공개 HTTPS 둘 다
erp-unified/tenant:leum/2.0.0로 200 정상 응답.
- 결정타: 통합서버 PID 4633이 IPv4
*:9940 (LISTEN)으로 1일 13시간 재기동 없이 안정 생존.
- 워치독 로그: 매분 재기동 시도 → 전부
포트 9940 bind 실패 — 종료(기존 4633이 이미 점유).
근본원인
lsof = /usr/sbin/lsof인데 워치독·erp-run.sh의
PATH에
/usr/sbin이 없음.
→
lsof: 명령을 찾을 수 없음 → check()의
lsof ... || need=1이
항상 need=1 → 매분 무조건 오판 재기동.
살아있는 4633이 bind 충돌로 새 인스턴스를 무산시켜 서비스는 무사했으나(운 좋은 무해),
매분 crownyc 프로세스 낭비 + 로그 오염 + 드물게 레이스로 살아있는 서버를 죽일 위험.
수정 (근본 + 견고화)
파일:
/Users/ef/crowny-erp/scripts/erp-tenant-watchdog.sh,
/Users/ef/crowny-erp/bin/erp-run.sh
- PATH에
/usr/sbin:/sbin 추가 — lsof 정상화(근본).
- 워치독 생존판정을 lsof→curl
/health 200 기반으로 전환 — 실제 응답이 정답, PATH·lsof 오판 완전 회피.
alive() { [ "$(curl -s -m3 -o /dev/null -w '%{http_code}' http://127.0.0.1:$1/health)" = "200" ]; }검증
- 수정 워치독 1회 실행 → PID 4633 보존, 재기동 안 함(오판 해소).
- 공개 HTTPS E2E: health·로그인(leum01)·매트릭스(10건)·알림(이슈1·지연4·임박2)·페이지·사이드카(up.leum) 전부 PASS.
- 워치독 plist(com.crowny.leum): RunAtLoad + StartInterval 60s 로드됨 → 다음 주기부터 수정본 자동 적용.
잔여(후속, 선택)
- 다른 테넌트/서비스 워치독 스크립트도 동일 PATH 누락 여부 스윕 필요(같은 오판 잠복 가능).
- 셀코어 경량인덱스 → 진짜 통합DB 승격, aimed 린모드 이전(기존 백로그 유지).