この(短縮された)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で失敗するのはなぜですか、どうすれば修正できますか? (そして、いいえ、mkdirにSudoを使用することはできません...)
追加する必要があります
PermissionsStartOnly=true
[Service]
へ。あなたのユーザーFOOd
はもちろん/var/run
にディレクトリを作成する権限がありません。 manページを引用するには:
ブール引数を取ります。 trueの場合、User =および同様のオプション(詳細についてはsystemd.exec(5)を参照)で構成された権限関連の実行オプションは、ExecStart =で開始されたプロセスにのみ適用され、他のさまざまなExecStartPre =には適用されません、ExecStartPost =、ExecReload =、ExecStop =、およびExecStopPost =コマンド。 falseの場合、設定はすべての構成済みコマンドに同じ方法で適用されます。デフォルトはfalseです。
これは許可の問題を説明または修正する答えではありませんが、systemds RuntimeDirectoryオプションを使用するだけでよいと思います。 man page の引用:
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
追加 +
完全な特権で実行するコマンドの前。
例えば:
ExecStartPre=+/bin/mkdir test
https://www.freedesktop.org/software/systemd/man/systemd.service.html#ExecStart= の「特別な実行可能プレフィックス」のセクションを参照してください