Files
kis_bot/docs/LS_WS_관측_예약.md
Your Name 5e44b86f8b fix(시세): LS spill-only·토큰 파일캐시·호가 snap_time 3초컷
- _feed_fallback 미러 OFF, LS cap/grace/hold RAM을 KIS·키움 spill과 정합
- LS 접근토큰 .ls_token_cache_*.json (재시작 재사용, revoke 루프 없음)
- 호가 RAM을 틱과 동일 LIVE_FEED_FALLBACK(snap_time)로 컷, 필터 max_age=0은 유지
- 익절 지정가 로그에 실제 호가 벤더(kis/kiwoom/ls 1·2·3차) 표기

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-27 15:21:21 +09:00

140 lines
4.3 KiB
Markdown

# 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 예약 |