Ich führe svnserve auf einem Fedora 17-Computer mit der folgenden systemd-Servicedatei aus:
[Unit]
Description=Subversion Server
After=syslog.target network.target
[Service]
User=svn
Type=forking
Environment=HOME=/repos/svn
ExecStart=/usr/bin/svnserve --daemon --pid-file=/run/svnserve/svnserve.pid -r /repos/svn
PIDFile=/run/svnserve/svnserve.pid
[Install]
WantedBy=multi-user.target
Dies funktioniert einwandfrei, solange / var / run / svnserve svn: svn gehört, wird jedoch beim Neustart unterbrochen, wenn dieser Besitz auf root: root zurückgesetzt wird. Ich möchte einen Pre-Launch-Schritt hinzufügen, der das Verzeichnis durchforstet.
Leider kann ich keine echte Dokumentation zu systemd-Einheitendateien finden, aber ich habe gesehen, dass einige 'ExecStartPre' verwenden, also habe ich Folgendes versucht:
ExecStartPre=/bin/chown svn:svn /run/svnserve
Leider schlägt dies mit dem Fehler "Operation nicht zulässig" fehl. Es sieht also so aus, als würde ExecStartPre auch als der in der Gerätedatei angegebene Benutzer ausgeführt.
Ich habe auch versucht, die Unit-Datei als root auszuführen und dann svnserve als svn-Benutzer über su zu starten, aber das führte zu einem vagen Fehler, dass die Befehlszeile ungültig war.
Wie können systemd-Einheiten Aktionen als root ausführen, bevor sie als bestimmter Benutzer ausgeführt werden?
/run
Verzeichnis und die PID-Datei bereits korrekt sein , aber viele davon sind mit dem Wechsel zu systemd und dem/usr
Verschieben kaputt gegangen .yum reinstall subversion
PermissionsStartOnly=false
bewirkt, dass alleExecStartPre
undExecStartPost
Befehle ignoriert werdenUser
und als root ausgeführt werden.Antworten:
Das Subversion-Paket in Fedora verwendet den tmpfiles-Mechanismus von systemd, um
/run/svnserve
beim Booten mit Root-Besitz zu erstellen (da die gepackte .service-Datei den Daemon anscheinend als root ausführt). Sie könnten kopieren/usr/lib/tmpfiles.d/svnserve.conf
zu/etc/tmpfiles.d/svnserve.conf
und die Besitzer ändern. Sieheman tmpfiles.d
für Details.quelle
Sie können ExecStartPre zu einem Sudo-Aufruf eines Skripts machen und den Benutzer svn für dieses Skript konfigurieren.
quelle
PermissionsStartOnly=false
systemd an und für sich an, ausgeführt zu werdenExecStartPre
undExecStartPost
als root zu verarbeiten.+
für dieExecStartPre
;ExecStartPre=+/path/to/thing-to-run-as-root
;; Auf diese Weise wenden Sie eine Änderung nur auf diesen einen bestimmten Befehl an und nehmen überhaupt keine globalen Änderungen vor.+
Präfix ist garantiert lokalisiert.