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

aig*_*fer 5 linux udev systemd

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"
Run Code Online (Sandbox Code Playgroud)

该规则很好地被检测到(我可以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
Run Code Online (Sandbox Code Playgroud)

但这不会在我停靠时启动。但是,如果我docked.target在对接时手动启动,则当我断开对接时它会按预期停止。

但是,如果我使用ENV{SYSTEMD_WANTS}="docked.target"文件并将其放入 中/etc/systemd/system/docked.target,目标会在我停靠时按预期启动。那么问题是我的用户级实例不知道系统级服务/目标。

有什么想法吗?我在网上看到了一些其他问题,其中一个几乎与我的完全一样:https://bbs.archlinux.org/viewtopic.php ?pid=1600019

aig*_*fer 4

尽管我仍然不知道如何工作,但在阅读此博客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
Run Code Online (Sandbox Code Playgroud)

我的 udev 规则为:

SUBSYSTEM=="usb", ACTION=="add", ENV{ID_VENDOR}=="17ef", ENV{ID_MODEL}=="100a", SYMLINK+="tp_mini_dock", TAG+="systemd"
Run Code Online (Sandbox Code Playgroud)

然后使用 启用它systemctl --user enable docked.target

现在,当我对接它时,udev 规则会创建 systemd 设备,该设备又会启动目标。然后该BindsTo选项确保当设备消失(拔掉插头)时目标停止。

当我在已插入扩展坞的情况下登录时,我必须做一些无意义的魔术才能使其正常工作。人们会想象,简单地添加到default.targetWantedByAfter足够了......我将在写完博客后添加一个博客链接。