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 ExecStartPrelaufen die 's auf diese Weise als root, aber die ExecStartlaufen 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
ExecStartPrein 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?
ExecStartPreals root ausgeführt wird, ist diePermissionsStartOnly=trueDirektive. Es beschränkt dieUserDirektive nur auf denExecStartBefehl. Siehe freedesktop.org/software/systemd/man/systemd.service.html