SystemdDoctor
StateDirectory= [Service]

StateDirectory= и родственные каталоги службы

Просит systemd создать каталог для постоянных данных службы в /var/lib, назначить владельцем пользователя службы и подключить его внутрь изоляции. Аналогично работают RuntimeDirectory=, CacheDirectory=, LogsDirectory=, ConfigurationDirectory=.

Что делает

Это правильная замена ручному созданию каталогов. systemd делает четыре вещи сразу: создаёт каталог, выставляет владельца и права, делает его доступным для записи даже при жёсткой изоляции и обновляет владельца при смене пользователя службы.

Значение — только имя, без пути: StateDirectory=myapp даёт /var/lib/myapp. Полный путь службе сообщается в переменной окружения STATE_DIRECTORY.

Где ставится. В секции [Service]. Права задаются параметрами вида StateDirectoryMode=.

Значения

ЗначениеЧто происходит
StateDirectory=myapp/var/lib/myapp — постоянные данные.
RuntimeDirectory=myapp/run/myapp — сокеты и pid-файлы, удаляется при остановке.
CacheDirectory=myapp/var/cache/myapp — расходные данные.
LogsDirectory=myapp/var/log/myapp — собственные файлы журнала.
ConfigurationDirectory=myapp/etc/myapp — настройки, службе доступны только для чтения.

Пример

Служба, которой не нужно создавать каталоги вручную.

[Service]
DynamicUser=yes
StateDirectory=myapp
RuntimeDirectory=myapp
LogsDirectory=myapp
StateDirectoryMode=0750
ExecStart=/usr/local/bin/myapp --data ${STATE_DIRECTORY} --socket ${RUNTIME_DIRECTORY}/app.sock

Вместе с временным пользователем это единственный надёжный способ хранить данные: владельца каталога systemd обновляет при каждом запуске.

Типичные ошибки

Значение — имя, а не путь. StateDirectory=/var/lib/myapp приведёт к попытке создать /var/lib/var/lib/myapp.

Каталог в /run удаляется при остановке службы, если не задано RuntimeDirectoryPreserve=.

Каталог настроек доступен службе только для чтения: изменяемые данные туда писать нельзя.

Ручное создание каталога с другим владельцем приводит к отказу при запуске: systemd попытается исправить владельца и может не суметь.

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

  • status=238/STATE_DIRECTORY в systemdКод 238/STATE_DIRECTORY: не удалось подготовить постоянный каталог службы в /var/lib из StateDirectory=.
  • status=233/RUNTIME_DIRECTORY в systemdКод 233/RUNTIME_DIRECTORY: не удалось подготовить каталог службы в /run из RuntimeDirectory=. Права, режим, удаление при остановке.
  • status=240/LOGS_DIRECTORY в systemdКод 240/LOGS_DIRECTORY: не удалось подготовить каталог журналов службы в /var/log из LogsDirectory=.
  • status=241/CONFIGURATION_DIRECTORY в systemdКод 241/CONFIGURATION_DIRECTORY: не удалось подготовить каталог настроек службы в /etc из ConfigurationDirectory=.

Рядом стоящие параметры

Где важен на практике

Источники

  • systemd.exec(5) официальная документация
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04) собственная проверка
    сверено 15 сентября 2026