lifecarelog
AI 정보

codex CLI가 무한 대기에 빠지는 이유 3가지와 해결법

스크립트에서만 멈추는 codex exec, 직접 재현해 보니 stdin 대기·신뢰 디렉토리·타임아웃 부재가 원인이었어요. 한 줄 해결법을 정리했어요.

5분 읽기

터미널에서는 잘 돌던 AI CLI가 자동화 스크립트 안에서만 조용히 멈춰 본 적 없나요? 에러도 로그도 없이 프로세스만 살아 있는 상태요.

저도 블로그 검증 파이프라인에 codex CLI를 붙여 보니 똑같은 일이 생겼어요. 평소 1분이면 끝나는 리뷰 작업이 30분 넘게 감감무소식이었죠. 직접 재현하면서 원인을 세 가지로 좁혔어요.

원인 1. stdin이 닫히기를 기다리고 있어요

가장 큰 범인은 표준 입력이었어요. 프롬프트를 명령 인자로 넘겨도, 비대화형 환경에서는 codex exec가 stdin으로 추가 입력이 올 수 있다고 보고 EOF를 계속 기다려요.

포그라운드에서는 "Reading additional input from stdin" 같은 안내가 보이지만, 백그라운드나 cron에서는 이 메시지가 눈에 안 띄어서 한참 헤맸어요.

해결은 한 줄이에요. 명령 끝에 </dev/null을 붙여 stdin을 아예 닫아 주면 곧바로 실행이 시작돼요.

원인 2. 신뢰할 수 없는 디렉토리에서 조용히 실패해요

테스트해 보면 git 저장소가 아닌 임시 폴더에서는 아무 출력 없이 끝나는 경우가 있어요. 신뢰할 수 있는 디렉토리인지 확인하는 단계에서 막히는 건데, 이때는 --skip-git-repo-check 옵션을 명시해야 통과해요.

멈춘 것처럼 보이는 증상과 무출력 실패는 겉보기에 비슷해서, 로그를 파일로 남겨 두지 않으면 구분하기 어려워요.

원인 3. macOS에는 timeout 명령이 없어요

무한 대기 방어로 timeout을 걸었더니 이번엔 종료 코드 127이 나왔어요. 확인해 보니 macOS 기본 환경에는 GNU timeout이 없어서예요. coreutils를 설치해 gtimeout을 쓰거나, 스크립트 안에 자체 타임아웃을 넣어야 해요.

stdin 닫기신뢰 디렉토리 옵션 확인타임아웃 방어 걸기

침묵하는 실패가 제일 무서워요

이번에 적용해 봤더니 세 원인의 공통점이 보였어요. 실패가 소리를 내지 않는다는 점이에요. 프로세스 상태만 보면 살아 있으니 성공처럼 보이죠.

그래서 자동화 단계마다 stdout을 파일로 남기고, 결과물이 실제로 생겼는지 확인하는 검증을 넣었어요. 플랜씨(plan-c) 같은 무료 금융계산기를 혼자 운영하면서 콘텐츠 발행까지 자동화에 맡기다 보니, 이런 작은 방어막이 쌓여야 밤에 마음 놓고 잘 수 있더라고요.

  • stdin은 명시적으로 닫기
  • 무출력 실패는 로그 파일로 구분
  • 타임아웃은 환경별로 확인

AI CLI를 파이프라인에 넣을 때는 대화형 도구를 비대화형으로 옮기는 순간 전제가 깨진다는 걸 기억해 보세요. 멈춘 프로세스를 발견하면 stdin부터 의심하는 게 지름길이에요.

#codex CLI#AI 자동화#디버깅

라이프케어로그 서비스가 궁금하신가요?

AI 기반 건강·일정·재활 관리 앱을 직접 써보세요.

서비스 살펴보기

관련 글

댓글

아직 댓글이 없어요. 첫 댓글을 남겨주세요.