Ich besitze einen systemd-Dienst, in dem ein Verzeichnis erstellt werden muss /run
, der jedoch ansonsten als Nicht-Root-Benutzer ausgeführt wird. Aus einem Blog-Beispiel habe ich die folgende Lösung abgeleitet:
[Unit]
Description=Startup Thing
[Service]
Type=oneshot
ExecStart=/usr/bin/python3 -u /opt/thing/doStartup
WorkingDirectory=/opt/thing
StandardOutput=journal
User=thingUser
# Make sure the /run/thing directory exists
PermissionsStartOnly=true
ExecStartPre=-/bin/mkdir -p /run/thing
ExecStartPre=/bin/chmod -R 777 /run/thing
[Install]
WantedBy=multi-user.target
Die Magie steckt in den 3 Zeilen, die dem Kommentar folgen. Anscheinend ExecStartPre
laufen die 's auf diese Weise als root, aber die ExecStart
laufen als der angegebene Benutzer.
Dies hat jedoch zu 3 Fragen geführt:
- Was macht der
-
vor dem/bin/mkdir
? Ich weiß nicht, warum es da ist oder was es tut. - Befinden sich mehrere
ExecStartPre
in einer Gerätedatei, werden sie nur in der Reihenfolge seriell ausgeführt, in der sie in der Gerätedatei gefunden wurden? Oder eine andere Methode? - Ist dies tatsächlich die beste Methode, um mein Ziel zu erreichen, das Ausführungsverzeichnis so zu erstellen, dass der Benutzer ohne Rootberechtigung es verwenden kann?
ExecStartPre
als root ausgeführt wird, ist diePermissionsStartOnly=true
Direktive. Es beschränkt dieUser
Direktive nur auf denExecStart
Befehl. Siehe freedesktop.org/software/systemd/man/systemd.service.html