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.htmlAntworten:
Bei Fragen zu systemd-Direktiven können Sie
man systemd.directives
die Manpage aufrufen, die die Direktive dokumentiert. Im Falle vonExecStartPre=
finden Sie es dokumentiert inman systemd.service
.Dort in docs for
ExecStartPre=
wird erklärt, dass das führende "-" verwendet wird, um darauf hinzuweisen, dass Fehler für diese Befehle toleriert werden. In diesem Fall wird es toleriert, wenn es/run/thing
bereits existiert.Die dortigen Dokumente erklären auch, dass "mehrere Befehlszeilen zulässig sind und die Befehle nacheinander seriell ausgeführt werden".
Eine Verbesserung Ihrer Methode zum Vorerstellen des Verzeichnisses besteht darin, dass es nicht für die ganze Welt beschreibbar ist, wenn Sie nur benötigen, dass es von einem bestimmten Benutzer beschrieben werden kann. Eingeschränktere Berechtigungen würden erreicht werden mit:
Dadurch ist das Verzeichnis im Besitz eines bestimmten Benutzers und für diesen vollständig zugänglich.
quelle
RuntimeDirectory
undRuntimeDirectoryMode
auch.Antwort auf # 3:
Schauen Sie sich die
RuntimeDirectory=
&RuntimeDirectoryMode=
Direktiven an. Vollständige Dokumente hier . Aber in der Zusammenfassung (geringfügige Änderung des Textes, aber das Wesentliche sollte bleiben):Um das zu nutzen, sollte dies der Trick sein:
quelle