Zsh 히스토리 데이터 손실 버그를 추적한 과정

1 day ago 5

Zsh가 종료 중 히스토리를 다시 쓰는 순간 SIGINT를 받으면 파일 읽기가 중단되지만, 불완전한 데이터를 정상 결과로 취급해 새 파일로 교체하면서 수년치 명령 기록이 사라질 수 있었음 inotify, fatrace, bpftrace로 추적한 결과, Zsh가 .zsh_history를 끝까지 읽지 않고 축소된 .zsh_history.new를 만든 뒤 원본 위로 rename하는 과정이 확인됨 5만 줄 미만을 쓸 때 강제로 충돌하도록 Zsh 5.9.1을 패치하고 코어 덤프를 분석해, errflag & ERRFLAG_INT가 readhistfile을 조기 종료하고 savehistfile이 이를 확인하지 않는 근본 원인을 찾음 수정안은 2025년 4월 마련됐지만 5.9.1 릴리스에서 누락됐으며, 2026년 7월 12일 출시된 Zsh 5.9.2에 최종 반영됨 별도 평가에서는 GPT-5.6 Sol과 Claude Opus 5가 증상과 bpftrace 기록만으로 버그를 안정적으로 찾았지만, 많은 모델은 올바른 가설을 떠올리고도 잘못된 이론의 검증에 매달려 진단에 실패함 수년간 반복된 히스토리 손실 전날 실행한 명령이 Ctrl+R 검색에서 사라지고, ~/.zsh_history에는 아주 오래된 항목만 남는 현상이 간헐적으로 발생함 최근 수년치 항목이 한꺼번에 사라졌지만 출력 불가능 문자나 불완전한 줄처럼 눈에 보이는 파일 손상은 없었음 손실 후 남은 줄 수도 매번 달랐음 초기에는 일일 백업으로 복원했지만 문제가 반복돼 원인 추적을 시작함 Zsh 자체, 다른 프로그램, 여러 zsh 프로세스의 상호작용 중 무엇이 원인인지는 처음에 알 수 없었음 Zsh 수정 커밋 53454는 2026년 7월 12일 출시된 Zsh 5.9.2에 포함됨 문제가 발생한 히스토리 설정 검색용 메모리에는 4,000줄을 불러오고, 파일에는 사실상 무제한으로 저장하도록 구성함 HISTSIZE=4000 HISTFILE=~/.zsh_history SAVEHIST=10000000 HIST_IGNORE_DUPS로 인접한 중복 항목을 저장하지 않고, INC_APPEND_HISTORY로 명령 실행 시 공유 파일에 즉시 추가함 NixOS의 /etc/zshrc가 기본 활성화하는 SHARE_HISTORY는 명시적으로 해제함 각 셸은 서로 분리된 세션이지만 같은 파일에 명령을 스트리밍함 다른 셸이 기록한 항목을 현재 세션에서 읽으려면 exec zsh를 실행함 파일 변경 추적...

Read Entire Article