Wie verwende ich ENV{SYSTEMD_USER_WANTS}= in einer Udev-Regel?

Wie verwende ich ENV{SYSTEMD_USER_WANTS}= in einer Udev-Regel?

docked.targetIch möchte auf meiner Benutzerebene systemd einrichten . Die Idee ist, einige Dienste auszuführen, um meine externen Displays zu konfigurieren.

Als Regel habe ich derzeit Folgendes:

SUBSYSTEM=="usb", ACTION=="add", ENV{ID_VENDOR}=="17ef", ENV{ID_MODEL}=="100a", SYMLINK+="tp_mini_dock", TAG+="systemd", ENV{SYSTEMD_USER_WANTS}="docked.target"

Die Regel wird problemlos erkannt (ich kann sehen, dev-tp_mini_dock.devicewenn ich angedockt bin).

Ich habe dann dies hier eingegeben ~/.config/systemd/user/docked.target(ebenfalls /etc/systemd/userohne Erfolg versucht):

[Unit]
Description=Docked to ThinkPad Mini Dock
BindTo=dev-tp_mini_dock.device

Dies startet jedoch nicht, wenn ich andocke. Wenn ich es jedoch docked.targetim angedockten Zustand manuell starte, stoppt es wie erwartet, wenn ich abdocke.

Wenn ich jedoch ENV{SYSTEMD_WANTS}="docked.target"die Datei verwende und einlege /etc/systemd/system/docked.target, startet das Ziel wie erwartet, wenn ich andocke. Das Problem besteht dann darin, dass meine Instanz auf Benutzerebene nichts über Dienste/Ziele auf Systemebene weiß.

Irgendwelche Ideen? Ich habe im Internet noch ein paar andere Fragen gesehen, und eine davon ist fast genau wie meine:https://bbs.archlinux.org/viewtopic.php?pid=1600019

Antwort1

Obwohl ich immer noch nicht weiß, wie ENV{SYSTEMD_USER_WANTS}es funktioniert, habe ich es geschafft, mein spezifisches Problem zu lösen, nachdem ich gelesen habedieser Blog.

Es stellt sich heraus, dass ich Ziele als Abhängigkeit von Geräten installieren kann. Ich habe meine Unit-Datei ~/.config/systemd/user/docked.targetwie folgt geändert:

[Unit]
Description=Docked to ThinkPad Mini Dock
BindsTo=dev-tp_mini_dock.device
After=dev-tp_mini_dock.device

[Install]
WantedBy=dev-tp_mini_dock.device

und meine udev-Regel lautet:

SUBSYSTEM=="usb", ACTION=="add", ENV{ID_VENDOR}=="17ef", ENV{ID_MODEL}=="100a", SYMLINK+="tp_mini_dock", TAG+="systemd"

und aktivieren Sie es anschließend mit systemctl --user enable docked.target.

Wenn ich es jetzt andocke, erstellt die Udev-Regel das Systemd-Gerät, das wiederum das Ziel startet. Dann BindsTostellt die Option sicher, dass das Ziel gestoppt wird, wenn das Gerät verschwindet (abgezogen wird).

Ich musste ein paar unsinnige Zaubertricks anwenden, damit es funktioniert, wenn ich mich anmelde und das Dock bereits angeschlossen ist. Man könnte meinen, dass das einfache Hinzufügen zu default.targetund WantedByausreicht After... Ich werde einen Link zu einem Blog hinzufügen, nachdem ich es geschrieben habe.

Antwort2

Sie können versuchen, SYSTEMD_USER_WANTSdurch zu ersetzen MANAGER_USER_WANTS. Ich bin mir bei dieser Namensänderung nicht 100 % sicher, aber zumindest in wird in den Quellen nicht mehr systemd-226von erwähnt und es scheint durch ersetzt worden zu sein . Zumindest hat es bei mir in einem ähnlichen Fall funktioniert.SYSTEMD_USER_WANTSMANAGER_USER_WANTS

Antwort3

Mann ... dieses Problem hat mich auch krank gemacht, was für ein Virus!

In meinem Fall wollte ich HDMI-Ereignisse (Monitor-Hotplug) abhören und habe einen Trick gefunden, wie ich dieses Problem umgehen kann. Ich dachte mir, wenn es udevirgendwie weiß, dass es einen Dienst mit diesem oder jenem Namen gestartet hat und sich weigert, dies erneut zu tun, dann lasst es uns glauben, dass es jedes Mal einen neuen Dienst startet. Alle Augen auf das entsprechende udevEreignis gerichtet:

UDEV  [19214.534185] change   /devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card0 (drm)
ACTION=change
DEVLINKS=/dev/dri/by-path/pci-0000:01:00.0-card
DEVNAME=/dev/dri/card0
DEVPATH=/devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card0
DEVTYPE=drm_minor
HOTPLUG=1
ID_FOR_SEAT=drm-pci-0000_01_00_0
ID_PATH=pci-0000:01:00.0
ID_PATH_TAG=pci-0000_01_00_0
MAJOR=226
MINOR=0
SEQNUM=3364
SUBSYSTEM=drm
USEC_INITIALIZED=3280572

und beachten Sie das SEQNUM. Es ändert sich bei jedem neuen Ereignis und das ist genau das, was wir wollen:

ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", ENV{SYSTEMD_USER_WANTS}+="monitor-hotplug@$env{SEQNUM}.service", TAG+="systemd"

Funktioniert auch für einwandfrei . Hoffentlich haben Ihre Veranstaltungen auch so etwas oder Ähnliches.~/.config/systemd/user/[email protected]SEQNUM

verwandte Informationen