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