Создайте каталог в / var / run при загрузке

39

У меня был демон, которому был нужен собственный /var/runкаталог для его файла PID с разрешением на запись, предоставленным пользователю демона.

Я обнаружил, что могу создать этот каталог с помощью этих команд:

# mkdir /var/run/mydaemon

Затем я мог бы изменить его владельца на пользователя / группу, под которой я хотел запустить процесс:

# chown myuser:myuser /var/run/mydaemon

Но этот каталог будет УДАЛЕН всякий раз, когда я выпускаю перезагрузку! Как заставить этот каталог создавать каждый раз, когда машина загружается?

user24601
источник

Ответы:

56

Существует две альтернативы, чтобы systemd создавал каталоги, обычно проще всего объявить RuntimeDirectoryв файле модуля вашего сервиса:

RuntimeDirectory=, RuntimeDirectoryMode= Принимает список имен каталогов. Если установлено, один или несколько каталогов с указанными именами будут созданы ниже /run(для системных служб) или ниже $ XDG_RUNTIME_DIR (для пользовательских служб), когда модуль запущен, и удалены, когда модуль остановлен. Каталоги будут иметь режим доступа, указанный в RuntimeDirectoryMode=, и будут принадлежать пользователю и группе, указанным в User=и Group=. Используйте это для управления одним или несколькими каталогами среды выполнения модуля и привязкой их времени жизни к среде выполнения демона. Указанные имена каталогов должны быть относительными и могут не содержать "/", т.е. должен ссылаться на простые каталоги для создания или удаления. Это особенно полезно для непривилегированных демонов, которые не могут создавать каталоги времени выполнения в / run из-за отсутствия привилегий, и чтобы убедиться, что каталог времени выполнения очищается автоматически после использования.

Или для каталогов времени выполнения, которые требуют более сложной или другой конфигурации или гарантий срока службы, используйте tmpfiles.dи отправьте свой пакет в файл /usr/lib/tmpfiles.d/mydaemon.conf:

 #Type Path            Mode UID      GID    Age Argument
 d     /run/mydaemon   0755 myuser myuser   -   -
HBruijn
источник
Я использовал последний, потому что реальный демон использует, systemd-sysv-generatorи у меня было достаточно кривых обучения на неделю. Только один файл .conf и одна строка. Чувствую себя хорошо сейчас B-)
user24601
Я уже последний определяется по моему /usr/lib/tmpfiles.d/php7.3-fpm.confи /usr/lib/tmpfiles.d/php7.2-fpm.confи по- прежнему не создает /run/phpкаталог.
MarthyM
3

Я создал сервис, который будет делать каталог при запуске:

vim /etc/systemd/system/mydaemon-helper.service

Содержание /etc/systemd/system/mydaemon-helper.service:

[Unit]
Description=MyDaemon Helper Simple Service
After=network.target

[Service]
Type=simple
ExecStartPre=-/usr/bin/mkdir /var/run/mydaemon
ExecStart=/usr/bin/chown myuser:myuser /var/run/mydaemon
Restart=on-abort


[Install]
WantedBy=multi-user.target

Тогда я запустил этот сервис:

systemctl start mydaemon-helper

systemctl status mydaemon-helper

Выход:

[root@alpha etc]# systemctl status mydaemon-helper.service
● mydaemon-helper.service - MyDaemon Helper Simple Service
   Loaded: loaded (/etc/systemd/system/mydaemon-helper.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

May 28 20:53:50 alpha systemd[1]: Starting MyDaemon Helper Simple Service...
May 28 20:53:50 alpha systemd[1]: Started MyDaemon Helper Simple Service.

Наконец, я сказал системе загрузить его при запуске:

systemctl enable mydaemon-helper

user24601
источник
Хорошо, я полагаю, я должен был поместить это в свой вопрос, учитывая, что я такой нуб. Я учусь, хотя - спасибо вам, ребята!
user24601
2
Нет, создание ответа было правильным решением, чтобы люди могли комментировать его, а также, чтобы он не загромождал ваш вопрос. Ответы на ваши собственные вопросы явно приветствуются на SO. И ваш ответ тоже не неправильный, просто есть гораздо лучшие способы сделать это, так что IMO, вы не должны были быть понижены. Это не должно быть проголосовано либо. :)
Брайан Ларсен
2
В то время как RuntimeDirectoryэто лучший способ сделать это прямо сейчас , я наткнулся на сервер со старой версией Systemd (208) , где эта директива не существует, так что этот ответ является единственным обходным маневром.
Давор Кубраник
Это также все еще кажется способом сделать это, если вам нужен каталог, созданный и принадлежащий другому пользователю, нежели пользователь сервиса, или для того, чтобы каталог сохранялся до перезагрузки, или для того, чтобы каталог был общим для нескольких сервисов.
Перкинс