status=233/RUNTIME_DIRECTORY в systemd
Код 233/RUNTIME_DIRECTORY значит, что systemd не сумел создать или настроить каталог в /run, объявленный параметром RuntimeDirectory=. Это каталог на время работы службы: там живут сокеты и pid-файлы, а при остановке systemd его удаляет.
Что это значит
Каталог создаётся заново при каждом запуске, владельцем становится пользователь службы, а права берутся из RuntimeDirectoryMode= (по умолчанию 0755). Раз каталог удаляется при остановке, хранить в нём что-то нужное между перезапусками нельзя — для этого есть StateDirectory=.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
В значении указан путь, а не имя
Параметр принимает имя относительно /run, а не полный путь. Запись
RuntimeDirectory=/run/myappневерна: systemd попытается создать /run/run/myapp и упрётся в недопустимый путь. -
Каталог уже существует и принадлежит другому пользователю
Если каталог в /run остался от прежнего запуска под другим пользователем (например службу перевели с root на app), systemd попытается исправить владельца и может не суметь этого при работающих внутри процессах.
-
/run переполнен
/run — это tmpfs в оперативной памяти, и её размер ограничен. Служба, которая пишет туда много данных, заполняет раздел, после чего каталоги перестают создаваться у всех.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
systemd называет полный путь каталога и причину отказа.
journalctl -xeu myapp.service --no-pager -n 20Все настройки каталога и пользователь службы: обычно причина видна прямо здесь.
systemctl show myapp.service -p RuntimeDirectory -p RuntimeDirectoryMode -p RuntimeDirectoryPreserve -p UserТекущее состояние каталога: существует ли, чей, с какими правами.
ls -ld /run/myappРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Параметр принимает имя относительно /run, а не полный путь. Запись
RuntimeDirectory=/run/myappневерна: systemd попытается создать /run/run/myapp и упрётся в недопустимый путь.
- Как проверить
-
Посмотрите действующее значение параметра.
systemctl show myapp.service -p RuntimeDirectory
- Как исправить
-
Укажите только имя:
RuntimeDirectory=myapp. Полный путь службе сообщается в переменной RUNTIME_DIRECTORY.RuntimeDirectory=myapp RuntimeDirectoryMode=0750
- Почему происходит
- Если каталог в /run остался от прежнего запуска под другим пользователем (например службу перевели с root на app), systemd попытается исправить владельца и может не суметь этого при работающих внутри процессах.
- Как проверить
-
Посмотрите владельца каталога и кто держит файлы внутри.
ls -ld /run/myapp sudo fuser -v /run/myapp 2>&1 | head
- Как исправить
-
Остановите службу, уберите каталог и запустите снова: при старте systemd создаст его заново с нужным владельцем.
sudo systemctl stop myapp.service && sudo rm -rf /run/myapp && sudo systemctl start myapp.service
- Почему происходит
- /run — это tmpfs в оперативной памяти, и её размер ограничен. Служба, которая пишет туда много данных, заполняет раздел, после чего каталоги перестают создаваться у всех.
- Как проверить
-
Посмотрите занятость /run и крупнейшие каталоги.
df -h /run sudo du -sh /run/* 2>/dev/null | sort -h | tail -5
- Как исправить
-
Уберите лишнее из /run и перенесите объёмные данные в /var/lib через
StateDirectory=. Размер tmpfs при необходимости меняется параметром монтирования.
Пример вывода
В параметре указан полный путь вместо имени. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
× myapp.service - My application
Active: failed (Result: exit-code) since Mon 2026-09-15 08:12:41 MSK; 1s ago
Process: 3100 ExecStart=/usr/local/bin/myapp (code=exited, status=233/RUNTIME_DIRECTORY)
systemd[1]: myapp.service: Failed to set up special execution directory in /run: Invalid argument
systemd[1]: myapp.service: Main process exited, code=exited, status=233/RUNTIME_DIRECTORY
Связанные ошибки
- status=238/STATE_DIRECTORY в systemd Код 238/STATE_DIRECTORY: не удалось подготовить постоянный каталог службы в /var/lib из StateDirectory=.
- status=226/NAMESPACE в systemd Код 226/NAMESPACE: не удалось настроить пространства имён монтирования, UTS или IPC. Частая причина — путь в ReadOnlyPaths= или ProtectHome=.
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- status=241/CONFIGURATION_DIRECTORY в systemd Код 241/CONFIGURATION_DIRECTORY: не удалось подготовить каталог настроек службы в /etc из ConfigurationDirectory=.
- AppArmor: apparmor="DENIED" в журнале ядра Профиль AppArmor запретил операцию: как прочитать запись, найти профиль и поправить его правильно.
- Caddy не занимает порты 80 и 443 без прав Служба падает при открытии слушателя: нет возможности занимать привилегированные порты.
- Configuration file is marked world-inaccessible Предупреждение о правах на unit-файл: служба работает, но файл недоступен для чтения другим.
- Interactive authentication required при управлении службой systemctl требует аутентификации: обращение от непривилегированного пользователя через polkit. Как разрешить точечно.
Где встречается чаще всего
Источники
-
systemd.exec(5)
233 EXIT_RUNTIME_DIRECTORY: не удалось подготовить каталог, см. RuntimeDirectory=. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено с RuntimeDirectory=/run/myapp и на заполненной tmpfs /run.