SystemdDoctor

Сокет и служба включены одновременно: конфликт при загрузке

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

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

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

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

    Обе ссылки автозапуска существуют, и systemd поднимает оба unit. Порядок между ними не задан, поэтому сбой случается не каждый раз — это и делает проблему запутанной.

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

    Даже отключённая служба поднимется, если её требует кто-то ещё через Requires= или Wants=.

Диагностика

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

Показывает состояние автозапуска обоих unit одной командой.

systemctl is-enabled myapp.socket myapp.service

Порядок событий при загрузке: видно, кто занял порт первым.

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

Решение

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

1. Служба включена вместе с сокетом
Почему происходит
Обе ссылки автозапуска существуют, и systemd поднимает оба unit. Порядок между ними не задан, поэтому сбой случается не каждый раз — это и делает проблему запутанной.
Как проверить
Посмотрите состояния включения обоих unit.
systemctl is-enabled myapp.socket myapp.service
Как исправить
Оставьте в автозапуске только сокет.
sudo systemctl disable myapp.service && sudo systemctl enable --now myapp.socket
2. Служба тянется зависимостью другого unit
Почему происходит
Даже отключённая служба поднимется, если её требует кто-то ещё через Requires= или Wants=.
Как проверить
Посмотрите, кто зависит от службы.
systemctl list-dependencies --reverse myapp.service --no-pager | head
Как исправить
Замените зависимость на сокет: другие unit должны требовать myapp.socket, а не саму службу.

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

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

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

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

Источники

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