Ich habe gerade die Installation und Einrichtung von systemd auf meinem Arch-Linux-System abgeschlossen (2012.09.07). Ich habe deinstalliert initscripts
(und die Konfigurationsdateien entfernt).
Ich möchte einen Dienst erstellen, der von einem Benutzer ohne Rootberechtigung gestartet und gestoppt werden kann. Der Dienst soll eine getrennte Bildschirmsitzung starten, in der rtorrent ausgeführt wird. Ich möchte jedoch, dass jeder Benutzer auf dem System, der diesen Dienst gestartet (aktiviert) hat, eine bestimmte Instanz speziell für ihn startet. Wie würde man das machen?
Ich erinnere mich, dass ich gelesen habe, dass systemd Benutzerinstanzen von Diensten unterstützt, jedoch keine Informationen darüber gefunden habe, wie dies einzurichten ist oder ob es sich auf das bezieht, was 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 hier und hier die Manpages durchgelesen habe , verstehe ich, wie systemd ein bisschen besser funktioniert. Insbesondere ermöglicht die Verwendung der Optionen User=
und WorkingDirectory=
, dass der Dienst in einer Benutzersitzung gestartet wird. Allerdings bleibt die Frage nach wie vor , dass der Benutzer selbst kann nicht start
, stop
, enable
, oder disable
der Service. Ein Fehler, bei dem der Zugriff verweigert wird, wird von gegeben systemctl
.
UPDATE 2 :
Zunächst habe ich zur Vereinfachung und zur besseren Nutzung der (noch unvollständigen) Benutzersitzungsfunktion von systemd die Benutzer-Sitzungseinheiten von sofar verwendet und seine Konfigurationsanweisungen befolgt.
Es scheint, dass es in der aktuellen Version von DBus (1.6.4-1) einen Fehler gibt, bei dem die Umgebungsvariable nicht gesetzt wird, DBUS_SESSION_BUS_ADDRESS
was bedeutet, dass die systemctl --user
Befehlsfehler ausgegeben werden mit:
Failed to get D-Bus connection: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
Die Variable sollte folgendermaßen aussehen:
DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/USERUID/dbus/user_bus_socket"
Dabei muss USERUID die UID des angegebenen Benutzers sein.
sudo
für die Benutzer vereinfachen und sie, wie in meinem Kommentar oben erwähnt, ihre eigene Servicedatei steuern lassen. Mit dieser Lösung kann der Benutzer jedoch auch die meisten anderen Dienste steuern ...
sudo
Dokumentation von sudoers (5) gelesen hätten, wäre dies nicht der Fall. Sudoers (5) enthält viele Beispiele zur Einschränkung der Argumente eines Befehls.