Ich habe ein Problem mit dieser (verkürzten) Systemd-Servicedatei:
[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
Es sei FOOd der Benutzername und FOO der Gruppenname, der für meinen Daemon bereits existiert /usr/local/bin/FOOd
.
Ich muss das Verzeichnis erstellen, /var/run/FOOd/
bevor ich den Daemon-Prozess /usr/local/bin/FOOd
über starte # systemctl start FOOd.service
. Dies schlägt fehl, da mkdir das Verzeichnis aufgrund von Berechtigungen nicht erstellen kann:
...
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
...
Warum schlägt mkdir bei ExecStartPre fehl und wie kann ich das beheben? (Und nein, ich kann sudo nicht für mkdir verwenden ...)
permissions
systemd
Matt
quelle
quelle
Antworten:
Sie müssen hinzufügen
zu
[Service]
. Ihr BenutzerFOOd
ist selbstverständlich nicht berechtigt, ein Verzeichnis in anzulegen/var/run
. So zitieren Sie die Manpage:quelle
ExecReload=
mit Root-Rechten ausgeführt. Dies ist möglicherweise nicht das, was Sie wollen.PermissionsStartOnly
wurde veraltet. Referenz: github.com/NixOS/nixpkgs/issues/53852 Wie geht das jetzt?+
unmittelbar danach einExecStartPre=
. Zum BeispielExecStartPre=+/bin/mkdir test
Dies ist keine Antwort, die das Berechtigungsproblem erklärt oder behebt, aber ich denke, Sie sollten nur die Option systemds RuntimeDirectory verwenden. Zitieren der Manpage :
Sie müssen also lediglich Ihre Servicedatei ändern in:
quelle
Fügen Sie
+
vor dem Befehl hinzu, den Sie mit vollständigen Berechtigungen ausführen möchten.Beispielsweise:
Weitere Informationen finden Sie im Abschnitt "Spezielle ausführbare Präfixe" unter https://www.freedesktop.org/software/systemd/man/systemd.service.html#ExecStart=
quelle