# LS WS 저널 관측 (Bye / sends≈1 / abort_why / RSP) 8/25형 **불완전 REG** (`OPEN sends≈1` → Bye 반복) 와 관측 패치 필드 (`abort_why`, `ws_same`, `LS WS RSP`) 를 **장중 hold** 구간에 자동 수집한다. 장외(hold 외)에는 LS 소켓이 없어 OPEN/Bye 가 없는 것이 **정상**이다. --- ## 1. 파일 목록 | 경로 | 역할 | |------|------| | `scripts/observe_ls_ws_journal.py` | journalctl 수집·집계 (once / watch) | | `scripts/observe_ls_ws_journal.sh` | cron용 래퍼 (stdout → 일별 래퍼 로그) | | `docs/LS_WS_관측_예약.md` | 본 문서 | | `logs/ls_ws_observe_YYYYMMDD_HHMMSS.log` | 매칭된 저널 **원문** | | `logs/ls_ws_observe_YYYYMMDD_HHMMSS_summary.md` | **집계 요약** (sends 분포, abort_why, …) | | `logs/ls_ws_observe_cron_YYYYMMDD.log` | cron/래퍼 실행 로그 (그날 누적 append) | 관련 코드(관측 필드 출력): | 경로 | 내용 | |------|------| | `kis_trader/ws/ls_ws.py` | `LS WS OPEN … abort_why=` / `CLOSE … ws_same=` / `LS WS RSP …` | | `kis_trader/utils/ls_ws_session_windows.py` | KR hold 기본 **07:00~20:00** | 유닛: `kis_trader_main.service` --- ## 2. 수동 실행 ```bash cd /home/hoon/kis_bot # 당일 00:00~지금 1회 집계 python3 -u scripts/observe_ls_ws_journal.py --once # hold 시각부터 지정 python3 -u scripts/observe_ls_ws_journal.py --once --since "2026-08-26 07:00:00" # 90분 폴링(2분 간격) 후 최종 집계 — 아침 재현용 python3 -u scripts/observe_ls_ws_journal.py --watch --minutes 90 --interval 120 # 래퍼 (cron과 동일, 로그 append) bash scripts/observe_ls_ws_journal.sh watch bash scripts/observe_ls_ws_journal.sh once --since "2026-08-26 07:00:00" ``` 실행 후 stdout 에 `raw=` / `summary=` 경로가 찍힌다. ```bash # 최신 요약 보기 ls -lt logs/ls_ws_observe_*_summary.md | head -3 tail -f logs/ls_ws_observe_cron_$(date +%Y%m%d).log ``` --- ## 3. cron 예약 (평일 아침) KR hold 기본 **07:00** → **07:05** 에 90분 watch 시작 (약 08:35 종료). 설치 (사용자 `hoon` crontab): ```cron # LS WS Bye/REG 관측 — 평일 07:05 KST, 90분 watch 5 7 * * 1-5 /home/hoon/kis_bot/scripts/observe_ls_ws_journal.sh watch ``` 장 마감 후 하루 요약(선택): ```cron # LS WS 당일 전체 once 요약 — 평일 20:10 (hold 종료 직후) 10 20 * * 1-5 /home/hoon/kis_bot/scripts/observe_ls_ws_journal.sh once --since "$(date +\%Y-\%m-\%d) 07:00:00" ``` 확인: ```bash crontab -l | grep observe_ls_ws ``` 제거: ```bash crontab -l | grep -v observe_ls_ws_journal | crontab - ``` --- ## 4. 요약 파일이 보는 것 | 집계 | 의미 | |------|------| | `LS WS OPEN` + `sends≈N` 분포 | N=1 다수 → 불완전 REG 의 | | `abort_why` | `opened_cleared` / `not_running` (REG 루프 중단 사유) | | `ws_same` | CLOSE/ERROR 가 **현재 소켓**인지 | | `LS WS RSP` / `rsp_cd` | REG ACK (body 없는 응답 포함) | | Bye / opcode=8 | 서버/연결 종료 시그니처 | | hold 관련 | 장외 대기 중이면 OPEN=0 이 정상 | 힌트 문구는 **가설**이다. `abort_why`·`ws_same` 없이 “고쳤다”고 단정하지 말 것. --- ## 5. 8/25 참고 시그니처 (이미 확인된 것) - 장중 `sends≈1` OPEN 다수 (예: 373) + Bye/CLOSE 반복 (~1400대) - 정상급 `sends≈15` 이상은 소수 - 당시 프로세스에는 `abort_why` / `ws_same` / `LS WS RSP` **없음** (관측 패치 전) - **재시작 후 hold 진입분**부터 새 필드가 찍힘 --- ## 6. 운영 체크리스트 1. 전날/당일 `kis_trader_main` 재시작으로 관측 패치·틱 구독전체 적재 코드 반영 확인 2. 평일 07:05 cron → `logs/ls_ws_observe_cron_YYYYMMDD.log` append 확인 3. `*_summary.md` 에서 `sends≈1` 비율·`abort_why`·`ws_same` 확인 4. 원인 확정 후에만 행동 패치(REG 재시도 / stale close 무시 등) — **선보고·승인** 5. `LS_WS_TICK_SAVE=true` 여도 **Bye로 구독이 죽으면** `ls_ws_ticks` 는 0 --- ## 7. 의존 - `journalctl` 읽기 권한 (동일 사용자 유닛 또는 systemd user) - Python 3, 레포 루트 `/home/hoon/kis_bot` - DB/증권사 API **호출 없음** (저널만) --- ## 8. 변경 이력 | 일자 | 내용 | |------|------| | 2026-08-26 | 스크립트·cron 문서 최초. 재시작 후 장외 hold 대기로 당일 새벽 재현 불가 → 07:05 watch 예약 |