udev 규칙에서 ENV{SYSTEMD_USER_WANTS}=를 어떻게 사용합니까?

udev 규칙에서 ENV{SYSTEMD_USER_WANTS}=를 어떻게 사용합니까?

docked.target내 사용자 수준 systemd에서 설정하고 싶습니다 . 아이디어는 외부 디스플레이를 구성하기 위해 일부 서비스를 실행하는 것입니다.

현재 내 규칙은 다음과 같습니다.

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

규칙은 잘 감지됩니다( dev-tp_mini_dock.device도킹하면 알 수 있습니다).

그런 다음 이것을 넣습니다 ( 운도 없이 ~/.config/systemd/user/docked.target시도했습니다 )./etc/systemd/user

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

하지만 도킹할 때는 시작되지 않습니다. 그러나 docked.target도킹된 상태에서 수동으로 시작하면 도킹 해제 시 예상대로 중지됩니다.

그러나 ENV{SYSTEMD_WANTS}="docked.target"파일을 사용하여 에 넣으면 /etc/systemd/system/docked.target도킹할 때 대상이 예상대로 시작됩니다. 그렇다면 문제는 내 사용자 수준 인스턴스가 시스템 수준 서비스/대상에 대해 모른다는 것입니다.

이견있는 사람? 나는 인터넷에서 몇 가지 다른 질문을 보았는데, 나와 거의 똑같은 질문이 있었습니다.https://bbs.archlinux.org/viewtopic.php?pid=1600019

답변1

아직 어떻게 작동하는지 모르지만 ENV{SYSTEMD_USER_WANTS}, 책을 읽은 후 특정 문제를 해결할 수 있었습니다.이 블로그.

장치에 대한 종속성으로 대상을 설치할 수 있다는 것이 밝혀졌습니다. 내 유닛 파일을 다음으로 변경했습니다 ~/.config/systemd/user/docked.target.

[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

내 udev 규칙은 다음과 같습니다.

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

그런 다음 를 사용하여 활성화합니다 systemctl --user enable docked.target.

이제 도킹하면 udev 규칙이 systemd 장치를 생성하고 대상 장치가 시작됩니다. 그런 다음 이 BindsTo옵션은 장치가 사라지면(플러그가 뽑힐 때) 대상이 중지되도록 합니다.

도크가 이미 연결되어 있는 상태에서 로그인할 때 이것이 작동하도록 하기 위해 말도 안되는 마술을 해야 했습니다. 누군가는 단순히 추가하는 것만으로도 충분하다고 생각할 것입니다 default.target... WantedBy블로그 After에 링크를 쓴 후에 링크를 추가하겠습니다.

답변2

SYSTEMD_USER_WANTS로 교체해 볼 수 있습니다 MANAGER_USER_WANTS. 이 이름 변경에 대해 100% 확신할 수는 없지만 적어도 소스에는 더 이상 systemd-226언급이 없으며 . 적어도 비슷한 경우에는 나에게 효과적이었습니다.SYSTEMD_USER_WANTSMANAGER_USER_WANTS

답변3

맙소사... 그 문제는 나도 역겹게 만들었어, 정말 버그야!

제 경우에는 HDMI(모니터 핫플러그) 이벤트를 듣고 싶었는데, 이 문제를 해결하는 방법을 찾았습니다. 글쎄요, 이것이 udev이 이름이나 저 이름으로 서비스를 시작했다는 것을 어떻게든 알고 있고 다시는 거부한다면 매번 새로운 서비스를 시작한다고 믿게 만들자고 생각했습니다. 해당 udev이벤트에 모든 시선이 집중됩니다:

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

그리고 SEQNUM. 이는 새로운 이벤트마다 변경되며 이것이 바로 우리가 원하는 것입니다.

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

에도 매력처럼 작동합니다 . 귀하의 이벤트에도 이와 유사한 것이 있기를 바랍니다.~/.config/systemd/user/[email protected]SEQNUM

관련 정보