如何在 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_WANTSMANAGER_USER_WANTS.我不是 100% 確定這個名稱更改,但至少在來源中不再systemd-226提及,並且它似乎被替換為.至少對於類似的情況,它對我有用。SYSTEMD_USER_WANTSMANAGER_USER_WANTS

答案3

哥們……這個問題也讓我感到噁心,真是個bug!

就我而言,我想監聽 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

相關內容