问题描述
我通常在使用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程序的末尾刷新流时才发生管道错误。
为避免该错误,任何读取输入的脚本必须始终使用所有可用输入,直到出现文件结尾,否则生成数据的脚本必须足够小心以免产生超出预期的结果。