SystemdDoctor
служба не работает сокеты сеть

Сокет не принимает данные: не тот тип

Тип сокета должен совпадать с тем, что ожидает программа: потоковый для TCP и unix-потоков, датаграммный для UDP. При несовпадении сокет открывается, а данные до службы не доходят.

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

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

  1. Объявлен потоковый сокет для службы, работающей с UDP

    Служба ждёт датаграммы, а systemd передаёт ей слушающий потоковый сокет. Обмена не происходит.

  2. Программа не умеет работать с переданным сокетом

    Даже верный тип не поможет, если программа открывает сокет сама. Тогда сокет-активация лишняя.

  3. Смешаны оба типа в одном сокете

    Объявление и потокового, и датаграммного адреса означает два дескриптора. Программа, ожидающая один, запутается.

Диагностика

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

Объявленные адреса и их типы.

systemctl show myapp.socket -p Listen

Слушает ли адрес и какого типа сокет.

sudo ss -tulnp | grep порт

Решение

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

1. Объявлен потоковый сокет для службы, работающей с UDP
Почему происходит
Служба ждёт датаграммы, а systemd передаёт ей слушающий потоковый сокет. Обмена не происходит.
Как проверить
Посмотрите тип сокета и что слушает служба.
systemctl show myapp.socket -p Listen
sudo ss -ulnp | grep 514
Как исправить
Замените параметр на датаграммный: ListenDatagram= вместо ListenStream=.
2. Программа не умеет работать с переданным сокетом
Почему происходит
Даже верный тип не поможет, если программа открывает сокет сама. Тогда сокет-активация лишняя.
Как проверить
Посмотрите, что программа делает при запуске.
journalctl -u myapp.service -n 20 --no-pager
Как исправить
Откажитесь от сокет-активации для такой программы: пусть слушает сама.
3. Смешаны оба типа в одном сокете
Почему происходит
Объявление и потокового, и датаграммного адреса означает два дескриптора. Программа, ожидающая один, запутается.
Как проверить
Посмотрите все объявления.
systemctl cat myapp.socket | grep -i listen
Как исправить
Оставьте один тип или задайте имена дескрипторов, чтобы программа их различала.

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

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

$ systemctl show mysyslog.socket -p Listen
Listen=[::]:514 (Stream)

$ sudo ss -ulnp | grep 514
# пусто: датаграммный сокет никто не открыл

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

Источники

  • systemd.socket(5)
    Типы сокетов и соответствующие параметры Listen….
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Воспроизведено потоковым сокетом для службы, ожидающей датаграммы.
    собственная проверка, systemd 255
    сверено 15 сентября 2026