sihwang-webapp 좀비 방지 wrapper 구현
결론
scripts/maintenance/sihwang_webapp_restart.sh 생성 완료.
재현 검증 완료:
- 8080 기존 리스너 종료
- dummy python3 -m http.server 8080로 포트 점유 재현
- wrapper 실행
- dummy PID 종료 확인
- run_webapp.py 신규 인스턴스 재기동 확인
- curl http://127.0.0.1:8080/ 응답 확인
변경 내용
생성 파일:
- /Users/ron/.openclaw/workspace/scripts/maintenance/sihwang_webapp_restart.sh
구현 로직:
1. launchctl unload ~/Library/LaunchAgents/com.openclaw.sihwang-webapp.plist
2. sleep 1
3. lsof -iTCP:8080 -sTCP:LISTEN -t로 점유 PID 탐지 후 kill -9
4. launchctl load ...plist
5. curl http://localhost:8080/ 반복 체크로 기동 확인
보강점: - 필수 명령 존재 확인 - PID 중복 제거 - 기동 확인 최대 20회 재시도 - plist 누락 시 즉시 실패
검증 기록
문법 검증:
- bash -n scripts/maintenance/sihwang_webapp_restart.sh 통과
실기동 검증:
- dummy PID: 40374
- wrapper가 종료한 PID: 40374
- 재기동 후 리스너 PID: 41621 확인
- 이후 현재 활성 PID: 51021 (run_webapp.py, launchd KeepAlive 재관리 상태)
- launchctl list | grep com.openclaw.sihwang-webapp 결과 확인
- HTTP 응답 본문 첫 줄 <!DOCTYPE html> 확인
검증 중 핵심 로그:
- 포트 8080 점유 PID 발견: 40374
- PID 40374 강제 종료
- 기동 확인 성공: http://localhost:8080/
Remaining Risks
launchctl unload가 두 번 연속Unload failed: 5: Input/output error를 반환했음. 이번 wrapper는 경고로 처리하고 포트 정리 +launchctl load로 복구에 성공했음.- 같은 패턴이 누적되면 다음 단계에서
bootout/bootstrap기반 후속 wrapper를 별도 검토할 필요 있음.
자체 평가
- 정확성: 4.5/5
- 완성도: 4.5/5
- 검증: 5/5
- 최소 변경: 5/5