Сокет без Listen: unit загружен, но ничего не слушает
Сокет-unit без параметра Listen…= не имеет смысла: слушать нечего. systemd сообщает, что unit не настроен, и запуск не проходит. Адрес задаётся одним из параметров: ListenStream= для TCP и unix-сокетов, ListenDatagram= для UDP, ListenFIFO= для каналов.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Параметр прослушивания не задан вовсе
Секция [Socket] есть, а адреса в ней нет. Такой unit systemd загружать откажется.
-
Параметр записан с опечаткой
Listen=,ListenTCP=илиListenPort=— не существующие имена. systemd отметит их как незнакомые и оставит сокет без адреса. -
Адрес задан в секции [Service] вместо [Socket]
Параметры сокета живут только в своей секции. В [Service] они игнорируются.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Показывает все принятые адреса прослушивания. Пустое значение — причина найдена.
systemctl show myapp.socket -p ListenВсе активные сокеты systemd с адресами и связанными службами.
systemctl list-sockets --no-pagerРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Секция [Socket] есть, а адреса в ней нет. Такой unit systemd загружать откажется.
- Как проверить
-
Посмотрите описание сокета.
systemctl cat myapp.socket
- Как исправить
-
Добавьте адрес: номер порта, адрес с портом или путь к unix-сокету.
[Socket] ListenStream=127.0.0.1:8080
- Почему происходит
Listen=,ListenTCP=илиListenPort=— не существующие имена. systemd отметит их как незнакомые и оставит сокет без адреса.
- Как проверить
-
Посмотрите, какие адреса systemd принял.
systemctl show myapp.socket -p Listen
- Как исправить
- Используйте точные имена: ListenStream, ListenDatagram, ListenSequentialPacket, ListenFIFO.
- Почему происходит
- Параметры сокета живут только в своей секции. В [Service] они игнорируются.
- Как проверить
-
Посмотрите, в какой секции стоит параметр.
systemctl cat myapp.socket | grep -n -B2 Listen
- Как исправить
- Перенесите параметр в [Socket] и перечитайте конфигурацию.
Пример вывода
Сокет без адреса прослушивания. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
× myapp.socket - Socket for myapp
Loaded: loaded (/etc/systemd/system/myapp.socket; enabled; preset: enabled)
Active: failed (Result: resources)
systemd[1]: myapp.socket: Unit has no Listen setting (ListenStream=, ListenDatagram=, ListenFIFO=, ...). Refusing.
systemd[1]: myapp.socket: Failed to listen on sockets: Invalid argument
Связанные ошибки
- Служба не получает сокет при сокет-активации Сокет активен, служба запускается, но не находит переданный дескриптор. Разбор: Accept, FileDescriptorName, соответствие имён.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Unit file is bad и ошибки разбора unit-файла systemd не может разобрать unit-файл: неизвестные параметры, ошибки в секциях, недопустимые значения. Как найти проблемную строку.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Apache: правила .htaccess не действуют Файл .htaccess игнорируется: запрещён параметром AllowOverride, нет нужного модуля, файл не читается.
- Bad file descriptor в журнале службы Ошибка 9 при операции с файлом: дескриптор закрыт или не тот. Разбор для служб и сокет-активации.
- Configuration file is marked world-inaccessible Предупреждение о правах на unit-файл: служба работает, но файл недоступен для чтения другим.
- Docker: unable to configure the Docker daemon with file daemon.json Демон Docker не запускается из-за ошибки в /etc/docker/daemon.json: неверный JSON или неизвестный ключ.
Источники
-
systemd.socket(5)
Параметры Listen…= и требование хотя бы одного из них. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено на .socket без ListenStream.