systemd: випуск дозволу з mkdir & ExecStartPre


37

У мене проблема з цим (скороченим) системним файлом служби:

[Unit]
Description=control FOO daemon
After=syslog.target network.target

[Service]
Type=forking
User=FOOd
Group=FOO
ExecStartPre=/bin/mkdir -p /var/run/FOOd/
ExecStartPre=/bin/chown -R FOOd:FOO /var/run/FOOd/
ExecStart=/usr/local/bin/FOOd -P /var/run/FOOd/FOOd.pid
PIDFile=/var/run/FOOd/FOOd.pid

[Install]
WantedBy=multi-user.target

Нехай FOOd - це ім'я користувача, а FOO - назва групи, яка вже існує для мого демона /usr/local/bin/FOOd.

Мені потрібно створити каталог /var/run/FOOd/перед тим, як запустити процес демон /usr/local/bin/FOOdчерез # systemctl start FOOd.service. Це не вдається, оскільки mkdir не може створити каталог через дозволи:

...
Jun 03 16:18:49 PC0515546 mkdir[2469]: /bin/mkdir: cannot create directory /var/run/FOOd/: permission denied
Jun 03 16:18:49 PC0515546 systemd[1]: FOOd.service: control  process exited, code=exited status=1
...

Чому mkdir не працює в ExecStartPre і як я можу це виправити? (І ні, я не можу використовувати судо для mkdir ...)


FYI: Я використовую Debian 8
Matt

Чи можете ви перекласти повідомлення про помилку на англійську мову?
Сухіхі

1
... 03 червня 16:18:49 PC0515546 mkdir [2469]: / bin / mkdir: каталог / var / run / FOOd / неможливо створити: немає дозволу 03 червня 16:18:49 PC0515546 systemd [1] : FOOd.service: процес керування вийшов, код = вийшов статус = 1 ...
Метт

Відповіді:


56

Вам потрібно додати

PermissionsStartOnly=true

до [Service]. FOOdЗвичайно, ваш користувач не має права створювати каталог /var/run. Щоб цитувати довідкову сторінку:

Приймає логічний аргумент. Якщо це правда, параметри виконання, пов’язані з дозволом, налаштовані з User = та подібними параметрами (див. Systemd.exec (5) для отримання додаткової інформації), застосовуються лише до процесу, запущеного з ExecStart =, а не до різних інших ExecStartPre = , ExecStartPost =, ExecReload =, ExecStop = і ExecStopPost = команди. Якщо помилково, налаштування застосовується до всіх налаштованих команд однаково. Типово встановлено значення false.


1
Чудово, саме те, що я шукав.
Роберт

2
Цей параметр робить команди ExecReload=запущеними в правах root. Це може бути не те, що ви хочете.
Rockallite

@Rockallite, це те, що в документації я цитував буквально, так, так.
embik

2
PermissionsStartOnlyбула застаріла. Довідка: github.com/NixOS/nixpkgs/isissue/53852 Як це зробити зараз?
адренанос

2
@adrelanos Тепер додайте +відразу після ExecStartPre=. НаприкладExecStartPre=+/bin/mkdir test
Джеймі Скотт

28

Це не відповідь, яка пояснює чи виправляє проблему з дозволом, але я думаю, що вам слід просто скористатися опцією systemds RuntimeDirectory. Цитуючи сторінку чоловіка :

RuntimeDirectory=, RuntimeDirectoryMode=
       Takes a list of directory names. If set, one or more directories by
       the specified names will be created below /run (for system
       services) or below $XDG_RUNTIME_DIR (for user services) when the
       unit is started, and removed when the unit is stopped. The
       directories will have the access mode specified in
       RuntimeDirectoryMode=, and will be owned by the user and group
       specified in User= and Group=. Use this to manage one or more
       runtime directories of the unit and bind their lifetime to the
       daemon runtime. The specified directory names must be relative, and
       may not include a "/", i.e. must refer to simple directories to
       create or remove. This is particularly useful for unprivileged
       daemons that cannot create runtime directories in /run due to lack
       of privileges, and to make sure the runtime directory is cleaned up
       automatically after use. For runtime directories that require more
       complex or different configuration or lifetime guarantees, please
       consider using tmpfiles.d(5).

Отже, все, що вам потрібно зробити, - це змінити службовий файл на:

[Unit]
Description=control FOO daemon
After=syslog.target network.target

[Service]
Type=forking
User=FOOd
Group=FOO
RuntimeDirectory=FOOd
RuntimeDirectoryMode=$some-mode
ExecStart=/usr/local/bin/FOOd -P /run/FOOd/FOOd.pid
PIDFile=/run/FOOd/FOOd.pid

[Install]
WantedBy=multi-user.target

Дякую дякую. На жаль, відсутній у пакеті OpenVPN Ubuntu !!
BaseZen

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.