StandardInput= в systemd: откуда служба читает ввод
Определяет, откуда процессы службы читают стандартный ввод. Для обычных служб это null: ввода нет, и попытка чтения даёт конец файла.
Что делает
Менять значение нужно редко. Основные случаи: передать службе данные из файла, привязать ввод к сокету при активации «по соединению», или передать короткий текст прямо из unit-файла через StandardInputText=.
Привязка ввода к терминалу для служб почти всегда ошибка: в контейнере и на сервере без консоли это даёт отказ запуска с кодом 208/STDIN.
Где ставится. В секции [Service].
Значения
| Значение | Что происходит |
|---|---|
null | по умолчанию: ввода нет. |
file:/var/lib/myapp/input.txt | читать из файла. |
socket | ввод из соединения при Accept=yes в сокете. |
tty | привязка к терминалу; для служб почти всегда ошибка. |
StandardInputText=строка | передать текст прямо из unit-файла. |
По умолчанию: null
Пример
Передача короткого задания службе прямо из unit-файла.
[Service]
Type=oneshot
StandardInputText=SELECT count(*) FROM orders;
ExecStart=/usr/bin/psql -U app -d shop
Для многострочного текста параметр можно повторять: строки будут переданы по порядку.
Типичные ошибки
Значение tty в контейнере или на машине без консоли даёт код 208/STDIN.
Ввод из сокета работает только в режиме «по соединению» (Accept=yes).
Секреты через StandardInputText= передавать не стоит: значение видно в systemctl show.
Связанные ошибки
- status=208/STDIN в systemdКод 208/STDIN: не удалось настроить стандартный ввод службы. Обычно дело в StandardInput=tty или в отсутствующем файле.
- Служба не получает сокет при сокет-активацииСокет активен, служба запускается, но не находит переданный дескриптор. Разбор: Accept, FileDescriptorName, соответствие имён.
Рядом стоящие параметры
Источники
- systemd.exec(5)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)