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.
quelle
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.Antworten:
Mit systemd können normale Benutzer normalerweise keine Systemdienste starten. Zwar wird das Gewähren von Zugriff über das Polkit unterstützt, doch fehlt dieser Teil noch etwas, und Sie können noch nicht nur einen bestimmten Dienst zulassen.
Da es sich bei rtorrent eigentlich nicht um einen Systemdienst handelt und Sie möchten, dass jeder Benutzer eine eigene Instanz von rtorrent hat, sollten Sie mit dem "Benutzer" -Modus von systemd experimentieren.
Wenn Sie sich anmelden, startet das System eine
user@<uid>.service
Systemeinheit für Sie, die eine separate "--user" -Instanz von systemd startet. Das neue Benutzersystem liest Unit-Dateien (beginnend mitdefault.target
) von~/.config/systemd/user/
,/etc/systemd/user/
und/usr/lib/systemd/user/
.quelle
DBUS_SESSION_BUS_ADDRESS
für einen bestimmten Benutzer festlegt, sodass systemctl nicht auf die Benutzersitzung zugreifen kann. Sobald ich dieses kleine Problem herausgefunden habe, funktioniert alles andere wunderbar!