StandardOutput= и StandardError= в systemd
Определяют, куда направляется стандартный вывод и поток ошибок процессов службы. По умолчанию всё идёт в журнал systemd и читается через journalctl.
Что делает
Значение по умолчанию удобнее всего: журнал хранит вывод вместе с метками времени, именем unit и приоритетом, умеет ротацию и фильтрацию. Перенаправление в файл лишает вас всего этого, зато иногда требуется — например когда программа пишет очень много и журнал раздувается.
Запись в файл требует префикса: append:/путь дописывает, truncate:/путь очищает при запуске, file:/путь — то же, что append, но без гарантии дописывания при перезапуске. Путь без префикса недопустим.
Где ставится. В секции [Service].
Значения
| Значение | Что происходит |
|---|---|
journal | по умолчанию: вывод в журнал systemd. |
null | вывод отбрасывается. |
append:/var/log/myapp/out.log | дописывать в файл. |
truncate:/var/log/myapp/out.log | очищать файл при каждом запуске. |
inherit | наследовать от родителя; для stderr — брать из stdout. |
syslog | объявлено устаревшим с systemd 246, работает как journal. |
По умолчанию: journal
Пример
Служба с очень подробным выводом — в отдельный файл.
[Service]
LogsDirectory=myapp
StandardOutput=append:/var/log/myapp/out.log
StandardError=journal
Каталог создаёт systemd через LogsDirectory=, поэтому права на него будут правильными. Ошибки при этом остаются в журнале — их удобнее искать там.
Типичные ошибки
Путь без префикса (StandardOutput=/var/log/app.log) недопустим: unit не загрузится.
Отсутствующий каталог даёт код 209/STDOUT при запуске: systemd создаёт файл, но не каталоги.
При жёсткой изоляции путь нужно разрешить: иначе запись невозможна даже с верными правами.
Значение syslog устарело: пишите journal.
Связанные ошибки
- status=209/STDOUT в systemdКод 209/STDOUT: systemd не смог настроить стандартный вывод службы. Чаще всего виноват путь в StandardOutput=append: или file:.
- status=222/STDERR в systemdКод 222/STDERR: не удалось настроить поток ошибок службы. Разбор причин и отличие от кода 209.
- status=240/LOGS_DIRECTORY в systemdКод 240/LOGS_DIRECTORY: не удалось подготовить каталог журналов службы в /var/log из LogsDirectory=.
- Read-only file system в журнале службыСлужба не может писать: файловая система только для чтения. Разбор: параметры изоляции unit, монтирование ro, ошибки файловой системы.
Рядом стоящие параметры
Источники
- systemd.exec(5)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)