如何在 udev 规则中使用 ENV{SYSTEMD_USER_WANTS}=?

如何在 udev 规则中使用 ENV{SYSTEMD_USER_WANTS}=?

我想在我的用户级 systemd 中设置一个docked.target。目的是运行一些服务来配置我的外部显示器。

我目前的规则如下:

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.targetWantedByAfter足够了...我会在写完博客后添加一个链接。

答案2

您可以尝试SYSTEMD_USER_WANTS用替换MANAGER_USER_WANTS。我对此名称更改不是 100% 确定,但至少在 中systemd-226不再在来源中提及SYSTEMD_USER_WANTS,并且似乎已用 替换MANAGER_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

相关内容