IOError:[Errno 32]管道损坏

问题描述

我通常在使用python中的paramiko ssh模块运行自动化脚本时观察到这一点。执行某些命令时,它失败并显示以下错误。在tcl脚本中也观察到了此错误,因此意识到它并非特定于语言

IOError: [Errno 32] broken pipe

我们在将输出流写入文件以及下面的文件时已经观察到

file_handle.write(line_data)

我们可以处理异常并添加一个重试块(参考: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,5))'
hhhhh

但是

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

这里写了65536个字符换行符;并且仅当在Python程序的末尾刷新流时才发生管道错误。


为避免该错误,任何读取输入的脚本必须始终使用所有可用输入,直到出现文件结尾,否则生成数据的脚本必须足够小心以免产生超出预期的结果。