SystemdDoctor
служба не работает частое вывод логи права изоляция

status=209/STDOUT в systemd

Код 209/STDOUT systemd выдаёт, когда не сумел подготовить стандартный вывод процесса согласно StandardOutput=. Программа не запускалась. Почти всегда причина в пути: каталога нет, нет прав на запись, или путь запрещён политикой изоляции того же unit-файла.

Что это значит

Отдельная ловушка — сочетание записи в файл с параметрами изоляции. Если в unit-файле стоит ProtectSystem=strict или ReadOnlyPaths=/var, то файл из StandardOutput=append:/var/log/app.log открыть не получится: systemd сначала применяет изоляцию, а потом открывает вывод.

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

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

  1. Каталога для файла вывода не существует

    systemd создаёт файл, но не создаёт каталоги по пути. Запись в /var/log/myapp/out.log при отсутствии каталога myapp не пройдёт.

  2. У пользователя службы нет права на запись в файл

    Файл вывода открывается уже под пользователем из User=. Файл, созданный ранее от root, остаётся недоступным для записи.

  3. Путь заблокирован собственными параметрами изоляции

    ProtectSystem=strict, ReadOnlyPaths=, PrivateTmp=yes делают каталог недоступным для записи внутри пространства имён службы, даже если снаружи права в порядке.

  4. Значение StandardOutput= не разбирается

    Допустимы journal, null, inherit, tty, socket, fd:имя, file:/путь, append:/путь, truncate:/путь. Запись вида StandardOutput=/var/log/app.log без префикса неверна.

Диагностика

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

Показывает шаг STDOUT и причину: нет файла, отказ в доступе или недопустимый аргумент.

journalctl -xeu myapp.service --no-pager -n 30

Действующие настройки вывода целиком, включая то, что могло прийти из drop-in.

systemctl show myapp.service -p StandardOutput -p StandardError -p LogsDirectory

Прямая проверка записи от имени пользователя службы — быстрее, чем перебирать права по каталогам.

sudo -u app sh -c 'echo проверка >> /var/log/myapp/out.log'

Решение

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

1. Каталога для файла вывода не существует
Почему происходит
systemd создаёт файл, но не создаёт каталоги по пути. Запись в /var/log/myapp/out.log при отсутствии каталога myapp не пройдёт.
Как проверить
Проверьте каталог из пути.
systemctl show myapp.service -p StandardOutput
ls -ld /var/log/myapp
Как исправить
Создайте каталог с нужным владельцем или поручите это systemd через LogsDirectory=myapp — тогда каталог появится в /var/log автоматически и с правильными правами.
sudo install -d -o app -g app -m 0750 /var/log/myapp
2. У пользователя службы нет права на запись в файл
Почему происходит
Файл вывода открывается уже под пользователем из User=. Файл, созданный ранее от root, остаётся недоступным для записи.
Как проверить
Проверьте владельца файла и права.
ls -l /var/log/myapp/out.log
Как исправить
Смените владельца файла на пользователя службы или перейдите на вывод в журнал: StandardOutput=journal и чтение через journalctl.
sudo chown app:app /var/log/myapp/out.log
3. Путь заблокирован собственными параметрами изоляции
Почему происходит
ProtectSystem=strict, ReadOnlyPaths=, PrivateTmp=yes делают каталог недоступным для записи внутри пространства имён службы, даже если снаружи права в порядке.
Как проверить
Посмотрите параметры изоляции в действующей конфигурации.
systemctl show myapp.service | grep -E "ProtectSystem|ReadOnlyPaths|ReadWritePaths|PrivateTmp"
Как исправить
Добавьте путь в ReadWritePaths= или используйте LogsDirectory=: systemd сам сделает каталог доступным для записи с учётом изоляции.
4. Значение StandardOutput= не разбирается
Почему происходит
Допустимы journal, null, inherit, tty, socket, fd:имя, file:/путь, append:/путь, truncate:/путь. Запись вида StandardOutput=/var/log/app.log без префикса неверна.
Как проверить
Сверьте значение с допустимым набором.
systemctl show myapp.service -p StandardOutput -p StandardError
Как исправить
Допишите префикс: StandardOutput=append:/var/log/myapp/out.log.

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

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

× myapp.service - My application
     Active: failed (Result: exit-code) since Mon 2026-09-14 17:30:12 MSK; 1s ago
    Process: 12440 ExecStart=/usr/local/bin/myapp (code=exited, status=209/STDOUT)

systemd[12440]: myapp.service: Failed at step STDOUT spawning /usr/local/bin/myapp: No such file or directory

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

Источники

  • systemd.exec(5)
    209 EXIT_STDOUT: не удалось настроить стандартный вывод, см. StandardOutput=.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Воспроизведено с append:/var/log/нет-такого-каталога/out.log и с ProtectSystem=strict при записи в /var/log.
    собственная проверка, systemd 255
    сверено 15 сентября 2026