SystemdDoctor
служба не работает сокеты зависимости загрузка

Служба стартует раньше своего сокета

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

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

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

  1. Служба включена в автозапуск вместо сокета

    Тогда при загрузке она стартует сама, занимает порт, и сокет уже не может открыться.

  2. Служба требуется другим unit напрямую

    Если кто-то объявил Requires=myapp.service, служба поднимется в обход сокета.

  3. Служба не связана с сокетом

    При несовпадении имён связь не устанавливается, и systemd не считает сокет источником активации.

Диагностика

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

Адреса, сокеты и активируемые ими службы.

systemctl list-sockets --no-pager

Связь между сокетом и службой с обеих сторон.

systemctl show myapp.socket -p Service && systemctl show myapp.service -p Sockets

Порядок событий при загрузке.

journalctl -b -u myapp.socket -u myapp.service --no-pager | head -20

Решение

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

1. Служба включена в автозапуск вместо сокета
Почему происходит
Тогда при загрузке она стартует сама, занимает порт, и сокет уже не может открыться.
Как проверить
Посмотрите состояния включения обоих unit.
systemctl is-enabled myapp.service myapp.socket
Как исправить
В автозапуске должен быть только сокет.
sudo systemctl disable myapp.service && sudo systemctl enable --now myapp.socket
2. Служба требуется другим unit напрямую
Почему происходит
Если кто-то объявил Requires=myapp.service, служба поднимется в обход сокета.
Как проверить
Посмотрите, кто зависит от службы.
systemctl list-dependencies --reverse myapp.service --no-pager | head
Как исправить
Замените зависимость на сокет: другие unit должны требовать myapp.socket.
3. Служба не связана с сокетом
Почему происходит
При несовпадении имён связь не устанавливается, и systemd не считает сокет источником активации.
Как проверить
Посмотрите связь в обе стороны.
systemctl show myapp.socket -p Service
systemctl show myapp.service -p Sockets
Как исправить
Укажите связь явно: Service= в сокете или Sockets= в службе.

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

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

systemd[1]: Started myapp.service - My application.
systemd[1]: myapp.socket: Failed to listen on sockets: Address already in use
systemd[1]: Failed to listen on myapp.socket - Socket for myapp.

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

Источники

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