← 목록
기타 2026-07-09 2KB 읽기 2분

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.0200 정상 응답.
  • 결정타: 통합서버 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
  1. PATH에 /usr/sbin:/sbin 추가 — lsof 정상화(근본).
  2. 워치독 생존판정을 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 린모드 이전(기존 백로그 유지).