SystemdDoctor
мешает работе сеть вывод

Broken pipe в журнале службы

Сообщение Broken pipe (номер 32, EPIPE) означает запись туда, где другая сторона уже закрылась. У сетевых служб это обычное дело — клиент отключился, — а у скриптов признак разорванного конвейера.

Вероятные причины

По порядку: сверху то, что встречается чаще.

  1. Клиент отключился, не дождавшись ответа

    Для веб-серверов и API это нормальный ход событий: посетитель закрыл страницу. Тревожным становится только массовый характер таких записей.

  2. Разорван конвейер в скрипте

    Правая часть конвейера завершилась раньше, и левая получает ошибку записи. Классика при использовании команд, читающих только начало потока.

  3. Приёмник вывода завершился

    При выводе в сторонний обработчик его завершение оставляет службу с закрытым каналом.

Диагностика

Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.

Частота: единичные случаи и поток — разные ситуации.

journalctl -u myapp.service --since "1 hour ago" --no-pager | grep -ci "broken pipe"

Куда идёт вывод и обрабатывается ли сигнал.

systemctl show myapp.service -p StandardOutput -p IgnoreSIGPIPE

Решение

Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.

1. Клиент отключился, не дождавшись ответа
Почему происходит
Для веб-серверов и API это нормальный ход событий: посетитель закрыл страницу. Тревожным становится только массовый характер таких записей.
Как проверить
Посмотрите частоту сообщений.
journalctl -u myapp.service --since "1 hour ago" --no-pager | grep -c -i "broken pipe"
Как исправить
Единичные записи можно игнорировать. Массовые говорят о медленных ответах: клиенты не дожидаются.
2. Разорван конвейер в скрипте
Почему происходит
Правая часть конвейера завершилась раньше, и левая получает ошибку записи. Классика при использовании команд, читающих только начало потока.
Как проверить
Посмотрите строку запуска и скрипт.
systemctl cat myapp.service | grep -E "^Exec"
Как исправить
Перепишите вызов без конвейера или обработайте разрыв в скрипте.
3. Приёмник вывода завершился
Почему происходит
При выводе в сторонний обработчик его завершение оставляет службу с закрытым каналом.
Как проверить
Посмотрите настройки вывода.
systemctl show myapp.service -p StandardOutput -p StandardError
Как исправить
Переведите вывод в журнал: его приёмник всегда на месте.

Пример вывода

Клиенты отключаются, не дождавшись ответа. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.

myapp[1200]: warn: write tcp <адрес>:8080-><адрес>:N: write: broken pipe
myapp[1200]: warn: client disconnected after 30.2s

Связанные ошибки

Где встречается чаще всего

Источники

  • write(2): ошибка EPIPE документация программы
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Воспроизведено отключением клиента во время медленного ответа.
    собственная проверка, systemd 255
    сверено 15 сентября 2026