Mam problem z tym (skróconym) plikiem usługi 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
Niech FOOd będzie nazwą użytkownika, a FOO nazwą grupy, która już istnieje dla mojego demona /usr/local/bin/FOOd
.
Muszę utworzyć katalog /var/run/FOOd/
przed uruchomieniem procesu demona /usr/local/bin/FOOd
za pośrednictwem # systemctl start FOOd.service
. To się nie udaje, ponieważ mkdir nie może utworzyć katalogu z powodu uprawnień:
...
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
...
Dlaczego mkdir nie działa w ExecStartPre i jak mogę to naprawić? (I nie, nie mogę używać sudo dla mkdir ...)
permissions
systemd
Matt
źródło
źródło
Odpowiedzi:
Musisz dodać
do
[Service]
. Twój użytkownikFOOd
oczywiście nie jest upoważniony do utworzenia katalogu w/var/run
. Aby zacytować stronę podręcznika:źródło
ExecReload=
uruchamiane z uprawnieniami administratora. To może nie być to, czego chcesz.PermissionsStartOnly
był przestarzały. Odniesienie: github.com/NixOS/nixpkgs/issues/53852 Jak to zrobić teraz?+
natychmiast poExecStartPre=
. Na przykładExecStartPre=+/bin/mkdir test
To nie jest odpowiedź, która wyjaśnia lub rozwiązuje problem z uprawnieniami, ale myślę, że powinieneś po prostu użyć opcji systemds RuntimeDirectory. Cytując stronę podręcznika :
Wystarczy zatem zmienić plik usługi na:
źródło
Dodaj
+
przed poleceniem, które chcesz uruchomić z pełnymi uprawnieniami.Na przykład:
Zobacz sekcję „Specjalne przedrostki wykonywalne” na https://www.freedesktop.org/software/systemd/man/systemd.service.html#ExecStart=
źródło