codex exec stdin, Reading additional input에서 멈출 때

codex exec stdin에서 Reading additional input from stdin... 문구만 보이더라도 바로 오류라고 단정하지 마세요. 현재 Codex CLI 0.156.1에서는 이 문구가 나온 뒤에도 파이프 입력의 끝(EOF)을 받으면 정상 실행됐습니다. 30~60초 안에 모델 실행이 시작되지 않는다면 인증을 다시 하기 전에 stdin을 누가 열어 두고 있는지부터 확인합니다.

명령 인자와 stdin 파이프가 열린 채 기다리다 EOF 뒤 실행을 이어가는 터미널 개념도

먼저 1분 대조군을 실행합니다

macOS·Linux에서는 추가 입력이 필요 없는 프롬프트의 stdin을 /dev/null로 닫아 봅니다.

codex exec "Reply with exactly OK." < /dev/null

Windows cmd에서는 다음처럼 NUL을 씁니다.

codex exec "Reply with exactly OK." < NUL

이 대조군은 끝나는데 원래 자동화만 멈춘다면, 로그인보다 원래 실행기가 stdin의 writer를 열린 채 유지하는지 확인할 차례입니다. macOS 기본 환경에는 timeout이 없으므로 먼저 위 명령을 실행하고, 기다림 한도가 필요하면 CI나 호출 프로그램의 45초 실행 제한을 사용합니다. 일반 터미널에서는 반응이 없을 때 Ctrl+C로 중단하고 그 시각과 stderr를 남깁니다.

프롬프트를 전달하는 두 방식을 구분합니다

Codex CLI 0.156.1의 codex exec --help 기준으로 입력 방식은 두 가지입니다.

원하는 일 입력 방식 stdin의 역할
파이프 전체를 지시로 사용 printf '지시' | codex exec - 전체 프롬프트
지시는 인자로, 로그는 문맥으로 추가 some-command | codex exec "로그를 요약해줘" <stdin> 추가 문맥

두 번째 방식에서는 프롬프트 인자가 있어도 Codex가 파이프가 끝날 때까지 추가 입력을 읽습니다. 로그를 만드는 앞 명령이 끝나지 않았거나 부모 프로세스가 writer를 닫지 않으면 모델 호출 전에서 기다릴 수 있습니다.

현재 버전에서 직접 확인한 결과

2026년 9월 24일 macOS arm64, Codex CLI 0.156.1, gpt-5.6-sol low에서 비민감 임시 폴더로 세 경로를 실행했습니다.

  1. codex exec -에 지시를 파이프로 전달하자 STDIN_OK가 반환됐습니다.
  2. 프롬프트 인자와 CONTEXT_MARKER_924 파이프를 함께 주자 안내 문구 뒤 ARG_OK CONTEXT_MARKER_924, exit 0이 나왔습니다.
  3. 프롬프트 인자에 /dev/null을 연결하자 안내 문구 뒤 DEVNULL_OK, exit 0이 나왔습니다.

따라서 안내 문구는 현재 버전에서 실패 판정 기준이 아닙니다. 문구 뒤 thread나 turn 이벤트가 시작되는지, 제한 시간 안에 종료되는지, 종료 코드가 무엇인지 함께 봐야 합니다.

계속 멈추면 이 순서로 확인합니다

1. 설치 버전을 적습니다

codex --version

공개 이슈에는 Windows의 Codex CLI 0.128.0과 macOS의 0.133.0에서 비대화형 stdin 대기가 보고됐습니다. 과거 버전의 보고를 현재 버전에 그대로 적용하지 말고, 내 버전과 운영체제를 같이 남깁니다.

2. stdin을 닫은 대조군과 비교합니다

/dev/null 또는 NUL 대조군만 성공하면 원래 호출 프로그램이 stdin EOF를 전달하는지 확인합니다. 무조건 재시도하면 같은 열린 파이프를 반복할 뿐입니다.

3. 파이프 앞 명령이 끝나는지 확인합니다

some-command | codex exec "결과를 요약해줘"

여기서 some-command가 계속 실행 중이면 Codex도 추가 문맥의 끝을 기다릴 수 있습니다. 먼저 앞 명령만 실행해 종료 여부와 종료 코드를 확인합니다.

4. JSON 모드에서는 모델 시작 이벤트를 봅니다

codex exec --json "Reply with exactly OK." < /dev/null

thread.started, turn.started가 나오면 적어도 stdin 대기를 지나 모델 실행 단계로 들어간 것입니다. 그 뒤의 인증·MCP·네트워크 오류는 stdin 문제와 별도로 판정합니다.

JSONL에서 내부 명령과 바깥 codex exec 종료 상태를 나누는 것과 별개로, 세션이 아예 잠겨 열리지 않는다면 Ctrl+Z 뒤 Codex 세션 잠금을 풀 때 확인 순서로 문제를 분리하세요.

오류 대안

  • /dev/null 대조군도 같은 버전에서 계속 멈춤: 45초처럼 제한 시간을 두고 stderr, 버전, 운영체제, 실행기 종류를 저장합니다.
  • 파이프 앞 명령이 끝나지 않음: Codex를 고치기 전에 생산자 명령의 종료 조건부터 고칩니다.
  • thread.started 뒤 실패: stdin을 통과한 뒤의 오류이므로 인증, 네트워크, 모델 또는 MCP 메시지를 따로 읽습니다.
  • 최신판에서는 재현되지 않음: 과거 회귀가 고쳐졌을 수 있으므로 “현재도 같은 버그”라고 단정하지 않습니다.

세션을 재개했을 때 예전 지침이 남았는지까지 확인해야 한다면 Codex resume 뒤 AGENTS.md 다시 읽기로 문제 범위를 분리하세요. stdin 대기와 세션 지침 재로드는 같은 증상이 아닙니다.

정리

  1. Reading additional input from stdin...은 그 자체로 실패가 아닙니다.
  2. 프롬프트 인자와 파이프를 같이 쓰면 파이프 내용은 추가 문맥이 되고 EOF까지 기다립니다.
  3. 추가 문맥이 필요 없으면 /dev/null 또는 NUL로 stdin을 닫은 대조군을 만듭니다.
  4. 버전, 모델 시작 이벤트, 종료 코드를 함께 보면 stdin 대기와 이후 오류를 나눌 수 있습니다.

자주 묻는 질문

이 문구가 보이면 바로 프로세스를 끝내야 하나요?

아닙니다. 파이프 생산자가 정상적으로 끝나는지와 thread.started·turn.started가 나오는지를 먼저 보세요. 제한 시간 안에 이벤트가 시작되고 exit 0이면 안내 문구는 실패 근거가 아닙니다.

프롬프트를 인자로 줌는데도 EOF가 필요한가요?

추가 파이프가 연결됐다면 그 내용은 <stdin> 문맥으로 추가될 수 있습니다. 생산자가 끝나지 않으면 추가 문맥의 끝도 알 수 없습니다. 추가 입력이 필요 없는 대조군에서는 /dev/null 또는 NUL로 닫아 비교합니다.

검증 기준

  • 마지막 확인: 2026-09-24
  • 확인 환경: macOS arm64, Codex CLI 0.156.1, gpt-5.6-sol low, 비민감 임시 폴더
  • 직접 결과: stdin 전체 프롬프트, 인자+파이프, 인자+/dev/null 세 경로. 뒤 두 경로는 안내 문구 후 exit 0
  • 공식 안내: OpenAI Codex CLI 문서
  • 주요 근거: OpenAI Codex 이슈 #20919, OpenAI Codex 이슈 #27019
  • 미확인: Windows 최신판·모든 CI runner의 재현, 정확 검색량, seoin.dev 독자 직접 반응

참고: OpenAI Codex CLI 문서, Codex 공개 이슈 #20919, Codex 공개 이슈 #27019. 공식 CLI 문서는 비대화형 실행의 범위를 설명하지만, 이 안내 문구의 EOF 규칙을 직접 확정하지는 않습니다. 그 부분은 0.156.1 --help와 직접 재현을 기준으로 썼습니다. 공개 이슈는 과거 버전의 사용자 재현 기록이며 현재 모든 환경의 동작을 보장하지 않습니다.

직접 만든 실습 자료와 새 도구 소식

AI 도구로 만든 실습 자료, 달라진 기능과 강의 소식을 준비하고 있습니다. 발송을 시작하면 안내해 드려요. 먼저 확인 메일에서 본인 이메일을 확인해 주세요.

신청하기 전에 첫 소식 미리보기에서 내용과 자료를 확인해 보세요.

질문이나 의견을 남겨주세요

이름을 입력하지 않아도 돼요. ‘깜짝 놀란 올빼미’ 같은 별명이 자동으로 붙어요.