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)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)