systemd:mkdirとExecStartPreの権限の問題

systemd:mkdirとExecStartPreの権限の問題

この(短縮された)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

許す食べ物ユーザー名はですフー私のデーモンにすでに存在するグループ名/usr/local/bin/FOOd

/var/run/FOOd/デーモンを起動する前にディレクトリを作成する必要があります。 mkdir が特権のためにディレクトリを作成できないため、失敗します。/usr/local/bin/FOOd# systemctl start FOOd.service

...
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
...

ExecStartPreでmkdirが失敗する理由と回避策は何ですか? (いいえ、sudoを使用してmkdirを実行することはできません...)

答え1

あなたは追加する必要があります

PermissionsStartOnly=true

到着する[Service]。あなたのユーザーは間違いなく..のマニュアルページを参照するFOOd権限がありません。/var/run

ブールパラメータを使用します。 true の場合、User= と同様のオプション (詳細は systemd.exec(5) を参照) で構成される権限関連の実行オプションは ExecStart= で始まるプロセスにのみ適用され、他のさまざまな ExecStartPre=、ExecStartPost=、ExecReload=、ExecStop= に適用ではありません。およびExecStopPost =コマンド。 falseの場合、設定されたすべてのコマンドに同じ方法で設定が適用されます。デフォルトは偽です。

答え2

これは権限の問題を説明または解決する答えではありませんが、単に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

答え3

+フル権限で実行するコマンドの前に追加します。

たとえば、

ExecStartPre=+/bin/mkdir test

「特殊実行ファイルのプレフィックス」を参照してください。https://www.freedesktop.org/software/systemd/man/systemd.service.html#ExecStart=

関連情報