簡體   English   中英

IOError: [Errno 32] 管道損壞

[英]IOError: [Errno 32] Broken pipe

我通常在使用 python 中的 paramiko ssh 模塊運行我的自動化腳本時觀察到這一點。 執行某些命令時,它失敗並顯示以下錯誤。 在 tcl 腳本中也觀察到此錯誤,因此意識到它不是特定於語言的

IOError: [Errno 32] Broken pipe

我們在將輸出流寫入文件時觀察到了它,如下所示

file_handle.write(line_data)

我們可以處理異常並添加重試塊(Ref: IOError: [Errno 32] Broken pipe: Python

但我很想知道為什么會發生這種情況,以便我可以在開展工作之前采取必要的預防措施。

我的發現導致“網絡掉線”或“接收系統無響應”。 但我對這些觀點並不十分信服。 請讓我知道根本原因

斷管只是意味着管道套接字的接收端已經關閉了連接。 例如,考慮這個:

% python3 -c 'print("hello\n" * 2' | python3 -c 'import os; os.write(1, os.read(0, 6))'
hello

沒有錯誤發生,因為管道有一個緩沖區來保存多余的數據。

現在 Linux 中的緩沖區默認為 64Ki,所以

% python3 -c 'print("h" * 65535)' | python3 -c 'import os; os.write(1, os.read(0, 5))'
hhhhh

% python3 -c 'print("h" * 65536)' | python3 -c 'import os; os.write(1, os.read(0, 5))'
hhhhhhException ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'>
BrokenPipeError: [Errno 32] Broken pipe

這里寫入了 65536 個字符換行符; 並且管道錯誤僅在 Python 程序結束時刷新流時發生。


為避免該錯誤,讀取輸入的任何腳本必須始終消耗所有可用輸入,直到出現文件結尾,或者生成數據的腳本必須足夠小心,以免產生超出預期的輸入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM