write: broken pipe
プロセスにエラーが多いとはどういう意味ですか?
level=error msg="attach: stdout: write unix /var/run/docker.sock->@: write: broken pipe"
これは、プロセスにより多くのファイル記述子が必要であるという意味ですか?それとも別のリソースがありますか?どちらに見なければなりませんか?
答え1
これは、誰かがシグナルハンドラをSIGPIPE
(SIG_IGN
無視)に設定し、エラー(リーダのないパイプに書き込もうとする)が代わりに終了状態で報告されることを意味しますwrite(2)
。
あなたの場合、Unixソケットのもう一方の端にあるプログラムが予期せずクラッシュまたは終了した可能性があります。まず見てみましょう。
それおそらくいくつかの洗練された攻撃 - 誤って書かれた多くのプログラムはエラーを予期せず、write(2)
戻り値をチェックしません。
によって終了するプロセスSIGPIPE
には特別なものはなく、これが機能する方法です。これがcommand | head -5
うまくいく方法です。command
終了後もパイプに書き続けたい場合は、パイプを受け取り、すべてが正常に終了します。ただし、コマンドがシグナルハンドラをインストールした場合、またはコールシェルがaを設定すると(それ自体と子プロセスがシグナルを無視する)、パイプに入るすべての項目が返され(「壊れたパイプ」)に設定されます。この点で、ソケットはパイプと同じように動作します。head -5
SIGPIPE
SIGPIPE
trap '' PIPE
SIGPIPE
write(2)
-1
errno
EPIPE