AI 해결 노트 · 2026-09-17 · 실측 2026-09-17
Codex CLI codex exec가 "Reading additional input from stdin..."에서 안 끝날 때 — 윈도우 실측
한 줄로
codex exec "질문"을 스크립트나 AI 에이전트의 백그라운드 셸에서 돌리면 Reading additional input from stdin...만 찍히고 끝나지 않을 수 있습니다. 표준입력(stdin)이 파이프로 열려 있으면 codex가 그 입력이 끝나기를 기다리기 때문입니다. 저희 실측에서는 < /dev/null로 stdin을 닫거나, 질문을 파이프로 넘기고 -를 붙였을 때 정상 종료했습니다.
증상
- 화면이나 로그에
Reading additional input from stdin...한 줄만 남고 더 진행되지 않습니다. - 따로 오류 설명이 나오지 않습니다. 저희는 60초 제한을 걸어 두었고, 제한에 걸려 종료 코드 124로 끝났습니다. 결과 파일은 비어 있었습니다.
- 9월 17일, Claude Code의 백그라운드 셸에서
codex exec에 질문을 인자로 넘겼을 때 이 상태가 됐습니다. 결과 파일은 0바이트였고, 로그 끝줄은Reading additional input from stdin...이었습니다. 작업을 끊고 질문을 stdin으로 넘기는 방식(아래 해결 2)으로 다시 돌리자 종료 코드 0으로 끝났습니다.
왜 이러나
codex exec --help의 [PROMPT] 설명에 답이 있습니다.
[PROMPT]
Initial instructions for the agent. If not provided as an argument (or if `-` is used),
instructions are read from stdin. If stdin is piped and a prompt is also provided, stdin
is appended as a `<stdin>` block질문을 인자로 줘도 stdin이 파이프로 연결돼 있으면, codex는 그 내용을 <stdin> 블록으로 덧붙이려고 읽습니다. 파이프 반대쪽이 닫히지 않으면 읽기가 끝나지 않습니다.
실측 환경
| 항목 | 값 |
|---|---|
| OS | Windows 11 Home (10.0.26200) |
| 셸 | Git Bash, PowerShell 7.6.6 |
| codex | codex-cli 0.153.4 |
| 질문 | Reply with the single word OK. (모든 조건 같음) |
| 공통 옵션 | --skip-git-repo-check -s read-only |
여섯 가지 조건으로 돌려 봤습니다
| 조건 | 셸 | stdin 상태 | 결과 | 걸린 시간 |
|---|---|---|---|---|
| A | Git Bash | 90초 동안 열려 있는 파이프(sleep 90 |) | 60초 제한에 걸려 강제 종료(종료 코드 124), 결과 파일 비어 있음 | 60초 |
| B | Git Bash | 닫힘(< /dev/null) | 종료 코드 0, OK | 7초 |
| C | Git Bash | 질문을 파이프로 넘기고 - 사용(echo "…" | codex exec … -) | 종료 코드 0, OK | 재지 않음 |
| D | Git Bash | 15초 뒤 닫히는 파이프(sleep 15 |) | 종료 코드 0, OK | 20초 |
| E | PowerShell 7 | null 장치에 연결 | 종료 코드 0, OK | 8초 |
| F | PowerShell 7 | 문자열 한 줄을 파이프로 넘기고 끝남 | 종료 코드 0, OK | 7초 |
D에서는 파이프 앞의 sleep 15가 끝나야 입력이 닫히는데, 전체가 20초 걸리고 정상 종료했습니다. codex가 입력이 끝나기를 기다렸다가 이어서 일했다는 설명과 맞는 결과입니다.
B에서도 Reading additional input from stdin... 문구는 똑같이 찍혔습니다. 이 문구만으로 멈췄다고 판단하지 말고, 그 뒤에 진행이 있는지 보셔야 합니다.
해결 — 셋 중 하나
1. stdin을 닫는다 (조건 B)
codex exec --skip-git-repo-check "질문" < /dev/null2. 질문을 stdin으로 넘긴다 (조건 C와 같은 방식, 긴 질문에 편함)
codex exec --skip-git-repo-check -o answer.md - < prompt.md질문 본문을 셸 인자로 따옴표 처리할 필요가 없어집니다. -o로 결과를 파일에 받는 방법과 주의점은 codex exec 결과를 파일로 받기 글에 따로 적었습니다.
3. 덧붙일 내용은 끝나는 명령으로 넘긴다
cat context.txt | codex exec --skip-git-repo-check "이 내용을 요약해 줘"이 형태는 저희가 돌려 본 예시가 아닙니다. 조건 F처럼 파이프 앞 명령이 끝나면 입력도 닫히므로 같은 원리로 끝날 것으로 봅니다. 문제는 파이프 앞쪽이 끝나지 않을 때(조건 A)입니다.
실패한 것
- 조건 A는 일부러 만든 실패입니다. 60초 제한이 없었다면 파이프를 쥔
sleep 90이 끝날 때까지 기다렸을 것으로 보지만, 제한 없이 돌려 보지는 않았습니다. - 9월 17일 첫 시도(증상 절)는 실제 작업이었고, 결과를 얻지 못해 다시 돌려야 했습니다.
확인하지 않은 것
- 맥·리눅스에서는 돌려 보지 않았습니다.
- codex 0.153.4 외 다른 버전은 확인하지 않았습니다.
- 에이전트 셸이 왜 stdin을 열어 둔 채로 두는지는 조사하지 않았습니다.
- 명령 프롬프트(cmd.exe)에서는 돌려 보지 않았습니다.
- 조건 C의 걸린 시간은 재지 않았습니다.