sudo systemd --user: Failed to connect to bus

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

sudo systemd --user: Failed to connect to bus

Beitrag von scientific » 24.02.2017 11:37:07

Hi Leute!

Ich nähere mich gerade experimentell der Debian-Paketierung an.
Zu diesem Behufe habe ich das Anliegen, einen Dienst mittels systemd neu starten zu müssen.
deb-systemd-invoke und deb-systemd-helper sind da offenbar die Werkzeuge der Wahl - wenn es um Dienste des System-systemd geht.

Jetzt habe ich spezielle Dienste, die im Kontext "systemd --user" laufen...
Ich möchte diese Dienste per Default für alle aktivieren, also kommen die Unit-Files nach /usr/lib/systemd/user. Damit diese Dienste dann auch beim ersten Login eines Users gestartet werden, muss ein Symlink nach /etc/systemd/user/default.target.want
Für einen System-Dienst geschieht das mit

Code: Alles auswählen

deb-systemd-helper enable service-name.service
im postinst-Skript des Paketes. Aber für User-Dienste klappt das so nicht.
Behelfsmäßig lege ich den Symlink manuell im Skript an.

Dann gehts aber noch darum, den systemd des Users zu reloaden und den Service zu starten/restarten.

Code: Alles auswählen

sudo -u $USER /bin/systemctl --user daemon-reload
oder

Code: Alles auswählen

su -c "/bin/systemctl --user daemon-reload" $USER
bringt aber nur die Fehlermeldung

Code: Alles auswählen

Failed to connect to bus: Datei oder Verzeichnis nicht gefunden
Werde ich mit sudo oder su dieser User, (sudo -i -u $USER, su - $USER) dann kann ich den Befehl ausführen...

Oder ist es gar nicht so klug, einen User-Daemon einem User unter dem Hintern weg, wenn er eingeloggt ist, neu zu starten, während ein Update läuft (Stichwort unattended upgrades)??

Meinungen? Vorschläge?

lg scientific
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

TomL

Re: sudo systemd --user: Failed to connect to bus

Beitrag von TomL » 24.02.2017 15:30:53

Hi

Ich habe hier gleich mehrfach Bauchschmerzen... *lacht*... schaun wir mal, was da dran ist.
scientific hat geschrieben:Dann gehts aber noch darum, den systemd des Users zu reloaden und den Service zu starten/restarten.

Code: Alles auswählen

sudo -u $USER /bin/systemctl --user daemon-reload
oder

Code: Alles auswählen

su -c "/bin/systemctl --user daemon-reload" $USER
bringt aber nur die Fehlermeldung....
Also, zunächst mal halte ich den "--user" für unnötig, weil es hier nicht den angemeldeten User betrifft, sondern faktisch "root".... und zwar deshalb, weil sowohl "sudo" als auch "su" vorher zu "root" wechseln, bevor "bin/systemctl" gestartet wird. "--user!" würde nur funktionieren, wenn der Aufruf so aussehen würde:

Code: Alles auswählen

thomas@thomaspc:~ $ /bin/systemctl --user daemon-reload
Hierbei geht es dann nicht um den Service-Manager des Systems, sondern um den des Users "thomas"

Deine beiden obenstehenden Aufrufe entsprechen imho eher dem hier:

Code: Alles auswählen

root@thomaspc:~ # /bin/systemctl --user daemon-reload
Hierbei wird der Service-Manager des Systems verwendet, aber der ist sowieso "default", die zusätzliche Übergabe von "--user" ist nicht notwendig.

Die Lösung ist letztendlich gar nicht so kompliziert.... es funktioniert die gleiche, wie bei dem unbeantworteten "Screen-Posting". Du musst Dich nur entscheiden, ob ein, zwei oder gar keine Password-Abfrage sein soll. Dieser folgende Befehl, vom User "thomas" ausgeführt, für den User "inet", verlangt zunächst von mir, dass ich das Password von "inet" eingebe, und dann weiterhin, weil ich einen Job mit root-Rechten starten will, das root-Password, weil "inet" derzeit dazu unberechtigt ist:

Code: Alles auswählen

thomas@thomaspc:~ $ /bin/su -l inet -c "/usr/bin/script -q -c '/bin/systemctl daemon-reload' /dev/null"
Das folgende Statement verlangt zweimal das root-Password, zunächst für den User-Wechsel, dann für den Systemd-Aufruf mit root-Rechten, für den "inet" ja auch nicht berechtigt ist:

Code: Alles auswählen

thomas@thomaspc:~ $ /usr/bin/pkexec -u inet /bin/bash -c "/usr/bin/script -q -c '/bin/systemctl daemon-reload' /dev/null" 
Ich würde keinesfalls "sudo" und einen Eintrag in der sudoers nutzen. Und ich würde auch nicht dem User (hier bei mir "inet") erlauben, 'systemctl' mit irgendwas zu starten.... nicht mal 'daemon-reload'. Der meiner Meinung nach richtige Weg wäre es, einen kleinen Wrapper zu schreiben und speziell für den Wrapper eine Policy-Rule anlegen, die den User berechtigt... und das funktioniert dann wunderbar.

Nur eines kann ich nicht beantworten.... wie schädlich und ob überhaupt ein dynamisches Starten und Schließen von Diensten zur Laufzeit und im User-Fenster (also das Normal-Arbeitszeit-Fenster) ist. Der individuelle Start bei User-Anmeldung ist unkritisch. Und wenns sich um einen User-bezogenen Individual-Service handelt, der gegebenfalls auch mit mehreren eigenen Instanzen bei mehreren Usern lebt, glaube ich auch, dass der "Stop" unkritisch" ist.... solange es sich eben im User-Space abspielt. Aber bei System-Services halte ich das für gefährlich. Aber das kannst letztendlich nur Du selber einschätzen.

Hth

scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: sudo systemd --user: Failed to connect to bus

Beitrag von scientific » 24.02.2017 15:53:46

Nun... Der ursprüngliche User ist ja _apt
Und ich fand mittlerweile raus, dass XDG_RUNTIME_DIR gesetzt sein muss...
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

TomL

Re: sudo systemd --user: Failed to connect to bus

Beitrag von TomL » 24.02.2017 16:01:50

ok, können wir dann alle 4 Postings wieder löschen? :mrgreen:

scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: sudo systemd --user: Failed to connect to bus

Beitrag von scientific » 24.02.2017 19:17:33

Da bin ich mir nicht sicher...
Denn ich müsste diese Variable korrekt setzen, für jeden eingelogten User... Und ob das so machbar ist... Und vor allem ob es sinnvoll ist.
Habs mal mit "systemctl restart user@$UID.service" probiert, aber das schmeißt eingeloggte User raus...
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

Antworten