Sockets=: связь службы с сокетами
Перечисляет сокет-unit, дескрипторы которых передаются этой службе. Нужен, когда имена службы и сокета не совпадают.
Что делает
По умолчанию служба получает дескрипторы от сокета с тем же именем. Параметр нужен в двух случаях: имена разные, или служба получает дескрипторы от нескольких сокетов сразу.
Связь можно объявить с любой стороны: Sockets= в службе или Service= в сокете. Достаточно одного, но объявлять полезно явно — так unit-файл читается однозначно.
Где ставится. В секции [Service].
Значения
| Значение | Что происходит |
|---|---|
Sockets=myapp.socket | один сокет с другим именем. |
Sockets=http.socket https.socket | несколько сокетов: служба получит дескрипторы от обоих. |
Пример
Служба с двумя сокетами.
[Service]
Sockets=http.socket https.socket
ExecStart=/usr/local/bin/web --systemd-sockets
Дескрипторы придут по порядку объявления сокетов. Различать их удобнее по именам через FileDescriptorName=.
Типичные ошибки
Служба должна уметь принимать готовые дескрипторы: иначе связь бесполезна.
Порядок дескрипторов зависит от порядка сокетов — полагаться на него хрупко, лучше использовать имена.
Связанные ошибки
- Служба не получает сокет при сокет-активацииСокет активен, служба запускается, но не находит переданный дескриптор. Разбор: Accept, FileDescriptorName, соответствие имён.
- Служба стартует раньше своего сокетаПри сокет-активации порядок обратный обычному: сокет должен подниматься первым. Как это объявить.
Рядом стоящие параметры
Где важен на практике
Источники
- systemd.service(5)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)