У меня проблема с этим (сокращенным) файлом службы systemd:
[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 и как я могу это исправить? (И нет, я не могу использовать sudo для mkdir ...)
permissions
systemd
Matt
источник
источник
Ответы:
Вам нужно добавить
к
[Service]
. Ваш пользователь,FOOd
конечно, не авторизован для создания каталога в/var/run
. Чтобы процитировать справочную страницу:источник
ExecReload=
работать от имени root. Это может быть не то, что вы хотите.PermissionsStartOnly
был объявлен устаревшим Ссылка: github.com/NixOS/nixpkgs/issues/53852 Как это сделать сейчас?+
сразу послеExecStartPre=
. НапримерExecStartPre=+/bin/mkdir test
Это не ответ, который объясняет или устраняет проблему с разрешениями, но я думаю, что вы должны просто использовать опцию systemds RuntimeDirectory. Цитирую справочную страницу :
Поэтому все, что вам нужно сделать, это изменить файл службы на:
источник
Добавьте
+
перед командой, которую вы хотите запустить с полными привилегиями.Например:
См. Раздел «Специальные исполняемые префиксы» по адресу https://www.freedesktop.org/software/systemd/man/systemd.service.html#ExecStart=.
источник