기술 · 실용 가이드
curl 오류 23: 재시도 전에 출력 소비자를 진단하는 방법
오류 23은 curl이 받은 데이터를 로컬 목적지에 쓰지 못했다는 뜻이다. stderr와 파이프 각 단계 상태를 보존하고 파일, 파이프, 터미널, 콜백 중 실패한 소비자를 고친 뒤 전체 바이트나 신뢰할 수 있는 해시로 검증한다.

curl 종료 코드 23은 로컬 쓰기 실패이며 네트워크 경로의 진단명이 아니다. stderr와 파이프 모든 단계의 상태를 저장하고 실제 출력 소비자를 식별해 쓰기 계약을 재현한 뒤, 수리 후 전체 바이트 수나 신뢰할 수 있는 해시로 완료를 판정한다.
1. 재시도 전에 첫 실패 보존
stderr를 숨기지 않는 최소 동등 명령으로 재현한다. 파일이면 명령, 정확한 경로, curl 종료 코드와 첫 쓰기 오류를 기록하고, 파이프면 직후 Bash PIPESTATUS를 저장하며 필요하면 pipefail을 켠다.
먼저 재시도 추가, stderr 폐기, TLS 변경을 하지 않는다. 23은 로컬 파일 시스템이나 비슷한 목적지의 쓰기 실패이며 재시도로 빠진 부모, 공간, 닫힌 파이프나 콜백 반환값을 고칠 수 없다.
2. 실패한 쓰기 소비자 식별
-o 파일의 부모, 권한, 남은 블록과 inode, 할당량, 마운트, 네임스페이스를 확인한다. stdout 파이프에서는 다음 프로세스가 소비자이므로 의도적 조기 종료, 충돌, 데이터 거부를 구분한다. 터미널과 libcurl 콜백도 출력 소비자다.
콜백은 처리한 전체 바이트 수를 보고해야 한다. 짧거나 실패한 반환은 CURLE_WRITE_ERROR로 끝나므로 요청 바이트, 반환 바이트, 애플리케이션 오류를 함께 기록한다.
3. 원격 요청이 아닌 로컬 목적지 재현
무해한 알려진 입력으로 소비자만 시험한다. curl 8.5.0 로컬 시험에서 /dev/full, 없는 부모 경로, head -c 1로의 전체 스트림은 curl 23이었고 sha256sum이 끝까지 읽은 경우 두 단계 모두 0이었다.
head의 조기 종료는 접두부만 필요할 때 의도적일 수 있지만 완전 다운로드로 표시해서는 안 된다. 설치 파일, 보관 파일, 데이터 가져오기는 소비자와 무결성 검사가 통과할 때까지 실패로 유지한다.
4. 소유자를 수리하고 승인 증거 정의
입증한 분기를 수리한다. 올바른 부모와 소유자를 만들고 공간을 확보하며 쓰기 가능한 마운트를 복구하고, 하류 프로그램이나 콜백을 고친 뒤 같은 증거를 다시 수집한다.
메시지가 사라진 것만으로는 부족하다. curl과 모든 필수 소비자의 상태, 올바른 네임스페이스의 목적지, 가능한 경우 길이와 배포자 해시 또는 서명을 확인하고 원래 stderr와 최종 검증을 함께 보관한다.
