status=209/STDOUT в systemd
Код 209/STDOUT systemd выдаёт, когда не сумел подготовить стандартный вывод процесса согласно StandardOutput=. Программа не запускалась. Почти всегда причина в пути: каталога нет, нет прав на запись, или путь запрещён политикой изоляции того же unit-файла.
Что это значит
Отдельная ловушка — сочетание записи в файл с параметрами изоляции. Если в unit-файле стоит ProtectSystem=strict или ReadOnlyPaths=/var, то файл из StandardOutput=append:/var/log/app.log открыть не получится: systemd сначала применяет изоляцию, а потом открывает вывод.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Каталога для файла вывода не существует
systemd создаёт файл, но не создаёт каталоги по пути. Запись в
/var/log/myapp/out.logпри отсутствии каталогаmyappне пройдёт. -
У пользователя службы нет права на запись в файл
Файл вывода открывается уже под пользователем из
User=. Файл, созданный ранее от root, остаётся недоступным для записи. -
Путь заблокирован собственными параметрами изоляции
ProtectSystem=strict,ReadOnlyPaths=,PrivateTmp=yesделают каталог недоступным для записи внутри пространства имён службы, даже если снаружи права в порядке. -
Значение
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'Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- 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
- Почему происходит
- Файл вывода открывается уже под пользователем из
User=. Файл, созданный ранее от root, остаётся недоступным для записи.
- Как проверить
-
Проверьте владельца файла и права.
ls -l /var/log/myapp/out.log
- Как исправить
-
Смените владельца файла на пользователя службы или перейдите на вывод в журнал:
StandardOutput=journalи чтение через journalctl.sudo chown app:app /var/log/myapp/out.log
- Почему происходит
ProtectSystem=strict,ReadOnlyPaths=,PrivateTmp=yesделают каталог недоступным для записи внутри пространства имён службы, даже если снаружи права в порядке.
- Как проверить
-
Посмотрите параметры изоляции в действующей конфигурации.
systemctl show myapp.service | grep -E "ProtectSystem|ReadOnlyPaths|ReadWritePaths|PrivateTmp"
- Как исправить
-
Добавьте путь в
ReadWritePaths=или используйтеLogsDirectory=: systemd сам сделает каталог доступным для записи с учётом изоляции.
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
Связанные ошибки
- status=222/STDERR в systemd Код 222/STDERR: не удалось настроить поток ошибок службы. Разбор причин и отличие от кода 209.
- status=208/STDIN в systemd Код 208/STDIN: не удалось настроить стандартный ввод службы. Обычно дело в StandardInput=tty или в отсутствующем файле.
- status=240/LOGS_DIRECTORY в systemd Код 240/LOGS_DIRECTORY: не удалось подготовить каталог журналов службы в /var/log из LogsDirectory=.
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- MySQL: Can't open the mysql.plugin table и повреждение системных таблиц MySQL не запускается: недоступны или повреждены системные таблицы. Права на каталог данных, версия схемы, восстановление.
- No such file or directory в журнале службы Служба не находит файл или каталог. Разбор: путь, момент запуска, изоляция unit-файла, символические ссылки, приватный /tmp.
- Operation not permitted в журнале службы Операция запрещена: не хватает возможностей процесса, мешает seccomp или модуль безопасности. Отличие от Permission denied.
- PostgreSQL: data directory has invalid permissions Кластер PostgreSQL не запускается из-за прав на каталог данных. Требование 0700 или 0750 и как вернуть владельца.
Источники
-
systemd.exec(5)
209 EXIT_STDOUT: не удалось настроить стандартный вывод, см. StandardOutput=. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено с append:/var/log/нет-такого-каталога/out.log и с ProtectSystem=strict при записи в /var/log.