SystemdDoctor
мешает работе сокеты отладка

Как проверить сокет-активацию до выкладки

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

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

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

  1. Неизвестно, умеет ли программа принимать дескриптор

    Это главный вопрос при переходе на сокет-активацию. Проверить его через unit-файлы долго и путано.

  2. Нужно проверить несколько адресов сразу

    Программы с несколькими сокетами требуют проверки каждого.

  3. Нужен режим «по соединению»

    Проверка простого обработчика, читающего со стандартного ввода, делается отдельным ключом.

Диагностика

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

Проверка передачи дескриптора без unit-файлов.

systemd-socket-activate -l 8080 /usr/local/bin/myapp

Кто фактически держит порт во время проверки.

sudo ss -tlnp | grep 8080

Решение

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

1. Неизвестно, умеет ли программа принимать дескриптор
Почему происходит
Это главный вопрос при переходе на сокет-активацию. Проверить его через unit-файлы долго и путано.
Как проверить
Запустите программу через команду проверки.
systemd-socket-activate -l 8080 /usr/local/bin/myapp --systemd-socket 2>&1 | head
Как исправить
Если программа приняла дескриптор и отвечает на порту, активация заработает. Если открыла порт сама или упала, поддержки нет.
2. Нужно проверить несколько адресов сразу
Почему происходит
Программы с несколькими сокетами требуют проверки каждого.
Как проверить
Передайте несколько адресов.
systemd-socket-activate -l 8080 -l 8443 /usr/local/bin/myapp 2>&1 | head
Как исправить
Порядок дескрипторов соответствует порядку адресов. Если программа различает их по именам, задайте имена в описании сокета.
3. Нужен режим «по соединению»
Почему происходит
Проверка простого обработчика, читающего со стандартного ввода, делается отдельным ключом.
Как проверить
Запустите в режиме на каждое соединение.
systemd-socket-activate -l 7777 --inetd /usr/local/bin/handler 2>&1 | head
Как исправить
Так проверяется схема с Accept=yes до создания шаблонной службы.

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

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

$ systemd-socket-activate -l 8080 /usr/local/bin/myapp
Listening on [::]:8080 as 3.
Communication attempt on fd 3.
Execing /usr/local/bin/myapp
myapp[4100]: using systemd socket fd=3

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

Источники

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