Watch at Ease看見世界,讀懂生活。

科技 · 實用指南

curl 錯誤 23:重試傳輸前先診斷輸出消費者

錯誤 23 表示 curl 無法把已接收資料寫入本機目的地。保留 stderr 與管線各階段狀態,確認消費者是檔案、管線、終端或回呼,修復寫入端後再以完整位元組或可信雜湊驗收。

原創圖:curl 輸出到檔案、管線、終端與回呼四類消費者及其失敗證據。
原創示意圖:錯誤 23 指向失敗的本機寫入端;先確認消費者再選擇修復。 Watch at Ease

curl 結束碼 23 是本機寫入失敗,不是網路路徑診斷。先保存 curl stderr 與管線各階段狀態,再辨識真正的輸出消費者、重現其寫入契約、修復該消費者,並以完整位元組數或可信雜湊驗收。

1. 重試前保留第一次失敗

用不隱藏 stderr 的最小等價命令重現。直接寫檔時記錄命令、目的路徑、curl 結束碼與第一個寫入錯誤;管線結束後立刻保存 Bash PIPESTATUS,必要時啟用 pipefail。

不要先加重試、丟棄 stderr 或更改 TLS。錯誤 23 指向本機檔案系統或類似目的地的寫入失敗;重試不能建立缺少的目錄、釋放空間、重開已關閉管線或修正回呼回傳值。

2. 找出擁有失敗寫入的消費者

若 -o 指向檔案,檢查精確路徑的父目錄、權限、剩餘區塊與 inode、配額、掛載狀態與命名空間。stdout 進入管線時,下一個程序就是消費者;判斷它是按設計提早結束、崩潰或拒收資料。

寫入回呼必須回報實際處理的全部位元組。短回傳或失敗會以 CURLE_WRITE_ERROR 終止,因此要求位元組、回傳位元組與應用程式錯誤都要保留。

3. 重現本機目的地而非遠端請求

用無害的已知輸入單獨測試消費者。本機 curl 8.5.0 測試中,寫入 /dev/full、缺少父目錄、以及把完整串流送給 head -c 1 都讓 curl 回傳 23;完整串流送入 sha256sum 時兩端皆為零。

head 提早關閉在只需前綴時可能是刻意行為,但必須標成部分讀取。安裝包、封存檔與匯入資料要求完整內容,在消費者與完整性檢查通過前不可把警告隱藏成成功。

4. 修復責任端並定義驗收證據

修復已證實的分支:建立正確目錄與擁有者、釋放或擴充檔案系統、恢復可寫掛載、修正下游程式、避免前綴消費者,或讓回呼完整處理並準確回報所有位元組。

驗收不能只看訊息消失。要求 curl 與所有必要消費者回傳預期狀態,確認目的地在正確命名空間,並在可用時核對長度、發布者雜湊或簽章;把原始 stderr、狀態、目的身分與最終驗證一起保存。

原創圖:curl 錯誤 23 的捕捉、辨識、重現、修復與驗證五步階梯。
原創實驗示意圖:保存生產者與消費者狀態,修復實際寫入端,再驗證完整位元組或可信雜湊。 Watch at Ease