После перезагрузки пропал каталог в /run: используем RuntimeDirectory

Сервис работал после ручного mkdir /run/report, но после перезагрузки снова не может создать PID-файл или локальный сокет. /run предназначен для временного состояния текущей загрузки. Ручная подготовка такого пути не является постоянной конфигурацией. Создание каталога нужно связать с жизненным циклом службы.

Проверить назначение данных

В /run уместны сокеты, PID-файлы и другие объекты, которые можно создать заново. База, очередь заданий и результаты пользователей должны жить в постоянном хранилище. Перед настройкой разберите содержимое каталога: автоматическое удаление при остановке не должно уничтожить данные, нужные следующему запуску.

[Service]
User=reportbot
Group=reportbot
RuntimeDirectory=report
RuntimeDirectoryMode=0750
ExecStart=/usr/local/bin/report-worker --socket=/run/report/worker.sock

Приложение и флаг условные, путь должен соответствовать реальной настройке программы. Для системной службы RuntimeDirectory=report создаёт /run/report. Владелец связан с User/Group, а режим задаётся явно. Обычно каталог удаляется при остановке; RuntimeDirectoryPreserve позволяет изменить это поведение в поддерживаемых сценариях.

Проверить эффективную конфигурацию

systemctl cat report.service
systemctl show report.service -p User -p Group -p RuntimeDirectory -p RuntimeDirectoryMode
stat -c '%n %U %G %a' /run/report
journalctl -u report.service -b --no-pager

Если каталог создаётся как root:root, проверьте User и Group в эффективном unit, а также стороннюю подготовку пути. Не пытайтесь лечить каждый запуск chmod 777. У сокета внутри каталога могут быть собственные права; доступ к папке ещё не гарантирует подключение к объекту.

Пример ожидаемого состояния после старта: /run/report принадлежит reportbot:reportbot с 750, сокет создан приложением, журнал не содержит Permission denied. После штатной остановки каталог исчезает, если сохранение не включено. Следующий запуск снова создаёт его с теми же атрибутами. Это воспроизводимое поведение вместо зависимости от ручной команды.

Выбрать постоянный каталог отдельно

Для состояния, которое должно переживать рестарт и загрузку, у systemd есть StateDirectory; для кэша — CacheDirectory, для журналов приложения — LogsDirectory. Они имеют другой смысл хранения. Нельзя переносить всё в RuntimeDirectory только ради удобного автоматического владельца. Различия разобраны в systemd.exec.

Если программа уже сама создаёт каталог, согласуйте два механизма. Приложению обычно достаточно получить готовый путь; повторный chown внутри него может быть лишним или невозможным при ограничениях. Для пользовательских служб корень runtime отличается: используется окружение пользователя, а не системный /run напрямую.

Проверить остановку и загрузку

На стенде проверьте старт, stop/start и новую загрузку. Во всех случаях путь должен иметь ожидаемый владелец и режим, а приложение — корректно создавать свои объекты. Если другим процессам нужен этот каталог после остановки, сначала уточните контракт: возможно, runtime принадлежит отдельной службе или требуется сохранение до конца загрузки.

В инструкции эксплуатации оставьте назначение каждого пути. Откройте программу Linux и Bash для DevOps-инженеров: настройка сервисного пользователя, прав и systemd помогает превращать ручную подготовку окружения в устойчивую конфигурацию учебного сервиса.

Ещё по теме

Продолжить на практике

  • Linux и Bash для DevOps-инженеров ↗

    Linux для работы с серверами: процессы, права, systemd, сеть, диски и логи. Автоматизируйте повседневные задачи на Bash и разберите типичные сбои сервиса — от занятого порта до переполненного диска.