status=238/STATE_DIRECTORY в systemd
Код 238/STATE_DIRECTORY относится к постоянному каталогу службы в /var/lib. Там лежат данные, которые должны переживать перезапуск и перезагрузку, поэтому в отличие от каталога в /run systemd его не удаляет — и именно из-за этого чаще всего возникают проблемы с владельцем.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Каталог создавали вручную под root, а служба работает от обычного пользователя
Это самый частый случай: каталог появился при первой установке от root, потом в unit-файл добавили
User=. systemd пытается сменить владельца, но если внутри есть файлы, принадлежащие другим пользователям, или каталог лежит на файловой системе без поддержки владельцев, шаг не проходит. -
Раздел /var переполнен
На переполненном разделе создать каталог невозможно. Служба при этом может не запускаться месяцами исправной работы спустя — место кончилось постепенно.
-
Имя каталога конфликтует с существующей символической ссылкой
Если /var/lib/myapp — ссылка на другой каталог (частый приём при переносе данных на отдельный диск), systemd откажется считать её своим каталогом состояния при несовпадении владельца цели.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Показывает полный путь и причину отказа от ядра.
journalctl -xeu myapp.service --no-pager -n 20Настройки каталога и пользователь: при DynamicUser=yes владелец меняется от запуска к запуску, и это отдельная история.
systemctl show myapp.service -p StateDirectory -p StateDirectoryMode -p User -p DynamicUserМесто на разделе и состояние каталога за одну команду.
df -h /var && ls -ld /var/lib/myappРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Это самый частый случай: каталог появился при первой установке от root, потом в unit-файл добавили
User=. systemd пытается сменить владельца, но если внутри есть файлы, принадлежащие другим пользователям, или каталог лежит на файловой системе без поддержки владельцев, шаг не проходит.
- Как проверить
-
Посмотрите владельца каталога и вложенных файлов.
ls -la /var/lib/myapp | head stat -c "%U:%G %n" /var/lib/myapp
- Как исправить
-
Смените владельца рекурсивно на пользователя службы, затем перезапустите её.
sudo chown -R app:app /var/lib/myapp && sudo systemctl restart myapp.service
- Почему происходит
- На переполненном разделе создать каталог невозможно. Служба при этом может не запускаться месяцами исправной работы спустя — место кончилось постепенно.
- Как проверить
-
Посмотрите свободное место и крупнейших потребителей.
df -h /var sudo du -sh /var/* 2>/dev/null | sort -h | tail -6
- Как исправить
- Освободите место: старые журналы, кеши пакетов, забытые резервные копии. Затем перезапустите службу.
- Почему происходит
- Если /var/lib/myapp — ссылка на другой каталог (частый приём при переносе данных на отдельный диск), systemd откажется считать её своим каталогом состояния при несовпадении владельца цели.
- Как проверить
-
Проверьте, не ссылка ли это, и куда она ведёт.
ls -ld /var/lib/myapp && readlink -f /var/lib/myapp
- Как исправить
-
Либо приведите владельца цели в порядок, либо смонтируйте нужный диск прямо в /var/lib/myapp вместо ссылки и добавьте
RequiresMountsFor=.
Пример вывода
Каталог принадлежит root, в unit-файле User=app. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
× myapp.service - My application
Active: failed (Result: exit-code) since Mon 2026-09-15 08:30:19 MSK; 1s ago
Process: 3400 ExecStart=/usr/local/bin/myapp (code=exited, status=238/STATE_DIRECTORY)
systemd[1]: myapp.service: Failed to set up special execution directory in /var/lib: Operation not permitted
systemd[1]: myapp.service: Main process exited, code=exited, status=238/STATE_DIRECTORY
Связанные ошибки
- status=233/RUNTIME_DIRECTORY в systemd Код 233/RUNTIME_DIRECTORY: не удалось подготовить каталог службы в /run из RuntimeDirectory=. Права, режим, удаление при остановке.
- status=239/CACHE_DIRECTORY в systemd Код 239/CACHE_DIRECTORY: не удалось подготовить каталог кеша службы в /var/cache из CacheDirectory=.
- No space left on device в журнале службы Нет места на устройстве: разбор по свободным блокам, по inode, по журналу systemd и по удалённым, но открытым файлам.
- Read-only file system в журнале службы Служба не может писать: файловая система только для чтения. Разбор: параметры изоляции unit, монтирование ro, ошибки файловой системы.
- status=240/LOGS_DIRECTORY в systemd Код 240/LOGS_DIRECTORY: не удалось подготовить каталог журналов службы в /var/log из LogsDirectory=.
- status=241/CONFIGURATION_DIRECTORY в systemd Код 241/CONFIGURATION_DIRECTORY: не удалось подготовить каталог настроек службы в /etc из ConfigurationDirectory=.
- AppArmor: apparmor="DENIED" в журнале ядра Профиль AppArmor запретил операцию: как прочитать запись, найти профиль и поправить его правильно.
- Caddy не занимает порты 80 и 443 без прав Служба падает при открытии слушателя: нет возможности занимать привилегированные порты.
Где встречается чаще всего
Источники
-
systemd.exec(5)
238 EXIT_STATE_DIRECTORY: не удалось подготовить каталог, см. StateDirectory=. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено на каталоге root при User=app и на заполненном /var.