Wie kann ich einen systemd-Dienst einrichten, der von einem Benutzer ohne Rootberechtigung als Benutzer-Daemon gestartet wird?

40647
Hans

Ich habe gerade den Installations- und Setup-Prozess von systemd auf meinem arch-linux-System (2012.09.07) abgeschlossen. Ich habe deinstalliert initscripts(und die Konfigurationsdateien entfernt).

Ich möchte einen Dienst erstellen, der von einem Benutzer ohne Rootberechtigung gestartet und angehalten werden kann. Der Dienst soll eine separate Bildschirmsitzung starten, auf der rtorrent ausgeführt wird. Ich möchte jedoch, dass jeder Benutzer im System, der diesen Dienst gestartet hat (aktiviert), eine bestimmte Instanz speziell für ihn gestartet hat. Wie würde man das machen?

Ich erinnere mich, dass ich gelesen habe, dass systemd Benutzerinstanzen von Diensten unterstützt, jedoch konnte ich keine Informationen finden, wie dies eingerichtet wird oder ob es sich auf das bezieht, wonach ich suche.

Servicedatei, die ich für das System verwendet habe:

[Unit] Description=rTorrent  [Service] Type=forking ExecStart=/usr/bin/screen -d -m -S rtorrent /usr/bin/rtorrent ExecStop=/usr/bin/killall -w -s 2 /usr/bin/rtorrent 

UPDATE # 1 :

Nachdem ich die Manpages hier und hier gelesen habe, verstehe ich, wie systemd etwas besser funktioniert. Insbesondere können mit den Optionen User=und WorkingDirectory=der Dienst in einer Benutzersitzung gestartet werden. Doch die Frage bleibt noch, dass der Benutzer selbst kann nicht start, stop, enable, oder disableder Service. Ein Zugriff wird verweigert Fehler ist gegeben durch systemctl.

UPDATE # 2 :

Zuallererst benutzte ich zur Vereinfachung und zur besseren Nutzung der (noch etwas unvollständigen) Benutzersitzung von systemd die benutzersitzenden Einheiten von sofar und folgte seinem Konfigurationsratschlag.

Es scheint, dass in der aktuellen Version von DBus (1.6.4-1) ein Fehler aufgetreten ist, bei dem die Umgebungsvariable DBUS_SESSION_BUS_ADDRESSmit den systemctl --userBefehlsfehlern nicht definiert wird.

Failed to get D-Bus connection: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11 

Die Variable sollte so aussehen:

DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/USERUID/dbus/user_bus_socket" 

Dabei muss USERUID die UID des angegebenen Benutzers sein.

20
Mir ist klar, dass man pro Benutzer eine eigene Servicedatei erstellen und diese einfach aktivieren kann. Ich möchte jedoch nur wissen, ob es möglich sein könnte, wie ich es oben beschrieben habe. Hans vor 12 Jahren 0
Gut genug, ich könnte einfach "sudo" für die Benutzer einrichten und sie haben, wie in meinem Kommentar oben erwähnt, ihre eigene Servicedatei steuern. Diese Lösung würde es dem Benutzer jedoch ermöglichen, auch die meisten anderen Dienste zu steuern ... Hans vor 12 Jahren 0
Das wäre nicht der Fall, wenn Sie die Dokumentation von sudo gelesen hätten - * sudoers (5) * hat viele Beispiele für die Einschränkung der Argumente eines Befehls. grawity vor 12 Jahren 0

1 Antwort auf die Frage

18
grawity

Normalerweise erlaubt systemd normalen Benutzern nicht, Systemdienste zu starten. Zwar wird der Zugriff über polkit unterstützt, dieser Teil fehlt jedoch immer noch etwas, und Sie können noch keinen einzigen Dienst zulassen.

Da rtorrent eigentlich kein Systemdienst ist und Sie möchten, dass jeder Benutzer seine eigene Instanz von rtorrent hat, experimentieren Sie mit dem "user" -Modus von systemd.

Wenn Sie sich anmelden, startet das System eine user@<uid>.serviceSystemeinheit für Sie, die eine separate "--user" -Instanz von systemd startet. Der neue Benutzer-systemd wird Unit - Dateien lesen (ab default.target) aus ~/.config/systemd/user/, /etc/systemd/user/und /usr/lib/systemd/user/.

Vielen Dank, das war es, was ich vermisst habe. Es hat sich jedoch auch als DBus-Problem herausgestellt: Es scheint einen Fehler in dbuse zu geben, der nicht die korrekte globale Variable "DBUS_SESSION_BUS_ADDRESS" für einen bestimmten Benutzer festlegt. Systemctl kann also nicht auf die Benutzersitzung zugreifen Fehler unser. Nachdem ich dieses kleine Problem herausgefunden hatte, funktioniert alles andere wunderbar! Hans vor 12 Jahren 1