Accept= в сокет-unit: экземпляр на соединение
Определяет, кто принимает соединение. При Accept=no служба получает слушающий сокет и обслуживает подключения сама. При Accept=yes systemd принимает каждое соединение и запускает для него отдельный экземпляр шаблонной службы.
Что делает
Режим «по соединению» удобен для простых обработчиков: программа читает данные со стандартного ввода и пишет ответ в вывод, ничего не зная о сети. Так работали службы через inetd, и systemd умеет то же самое.
Для обычных сетевых служб нужен Accept=no: веб-сервер или база сами управляют множеством соединений, и запуск экземпляра на каждое подключение был бы разорительным.
Где ставится. В секции [Socket]. При значении «yes» служба должна быть шаблонной, с символом @ в имени.
Значения
| Значение | Что происходит |
|---|---|
no | по умолчанию: служба получает слушающий сокет. |
yes | экземпляр службы на каждое соединение. |
По умолчанию: no
Пример
Простой обработчик, запускаемый на каждое подключение.
# echo.socket
[Socket]
ListenStream=7777
Accept=yes
# echo@.service
[Service]
ExecStart=/usr/local/bin/echo-handler
StandardInput=socket
Имя службы обязано быть шаблонным: systemd подставит в экземпляр номер соединения.
Типичные ошибки
При Accept=yes служба обязана быть шаблонной: обычная не запустится.
Для нагруженных служб режим «по соединению» неприменим: на каждое подключение создаётся процесс.
Ограничить наплыв можно параметрами MaxConnections= и MaxConnectionsPerSource=.
Связанные ошибки
- Служба не получает сокет при сокет-активацииСокет активен, служба запускается, но не находит переданный дескриптор. Разбор: Accept, FileDescriptorName, соответствие имён.
- status=208/STDIN в systemdКод 208/STDIN: не удалось настроить стандартный ввод службы. Обычно дело в StandardInput=tty или в отсутствующем файле.
- Сокет без Listen: unit загружен, но ничего не слушаетВ .socket не задан ни один параметр Listen…= — сокет не принимает соединения. Как объявить адрес прослушивания.
Рядом стоящие параметры
Источники
- systemd.socket(5)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)