当我看到某个流程出现一堆write: broken pipe
错误时,这意味着什么?
level=error msg="attach: stdout: write unix /var/run/docker.sock->@: write: broken pipe"
这是否意味着该进程需要更多文件描述符?或任何其他资源?我应该看哪条路?
答案1
这意味着有人已将信号处理程序设置为SIGPIPE
to SIG_IGN
(忽略),并且错误(尝试写入没有读取器的管道)而是通过 的退出状态报告write(2)
。
在您的情况下,Unix 套接字另一端的程序很可能崩溃或意外退出。我会先研究一下。
它或许一些复杂的攻击——许多写得很糟糕的程序不会预期错误write(2)
,也不检查其返回值。
由于 a 而退出的进程SIGPIPE
没有什么特别的,这就是事情应该如何进行的。这就是command | head -5
工作原理;如果退出command
后仍想向管道写入内容,它将收到一个,一切都会正常终止。但是,如果 command 安装了一个信号处理程序,或者如果调用 shell 设置了 a (这将导致其自身及其子进程忽略该信号),则任何进入管道的内容都将返回并设置为(“损坏的管道”)。在这方面,套接字的工作方式与管道相同。head -5
SIGPIPE
SIGPIPE
trap '' PIPE
SIGPIPE
write(2)
-1
errno
EPIPE