udev systemd 调用 @remove 不起作用,但会触发脚本 openSuse Leap42.3

udev systemd 调用 @remove 不起作用,但会触发脚本 openSuse Leap42.3

您好,我有一个 UDEV 规则,它调用一个 systemd 服务,该服务在我的 USB 驱动器被移除时卸载它。

ACTION=="remove", KERNEL=="sd*" SUBSYSTEMS=="usb", SUBSYSTEM=="block", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", ENV{SYSTEMD_WANTS}="umount_extern_backup.service"

问题是,如果我物理拔掉 USB 驱动器,则 systemd 服务不会执行。

如果我使用相同的 UDEV 规则

ACTION=="remove", KERNEL=="sd*" SUBSYSTEMS=="usb", SUBSYSTEM=="block", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", RUN+="/bin/umount -l /extern-backup"

直接执行/bin/umount -l /extern-backup该命令会被执行,但我收到一个错误: udevd[10181]: Process '/bin/umount -l /extern-backup' failed with exit code 32.这就是为什么我尝试执行 systemd 服务,因为这样 umount 命令就起作用了。

如果我更改 UDEV 规则来执行 shell 脚本,它会起作用:

ACTION=="remove", KERNEL=="sd*" SUBSYSTEMS=="usb", SUBSYSTEM=="block", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", RUN+="/usr/local/sbin/test.sh"

test.sh 被执行。但我不能直接使用 UDEV 调用的 shell 脚本来执行该umount命令,因为它给我带来了与直接从 UDEV 执行相同的错误/bin/umount -l /extern-backup

如果我手动调用systemctl start umount_extern_backup.service该服务也可以工作。

为了锦上添花,如果我ACTION=="remove"用替换ACTION=="add",UDEV 规则,那么 systemd 服务将被执行,并在我连接 USB 设备时尝试卸载。

这是我的系统服务:

[Unit]
Description=umount lazy /extern-backup service

[Service]
Type=oneshot
RemainAfterExit=no
ExecStart=/bin/umount -l /extern-backup

[Install]
WantedBy=multi-user.target

答案1

RUN+="/usr/bin/systemctl umount_extern_backup.service"正如上面评论中提到的作品。

我检查了SYSTEMD_WANTS设备属性这里他们写道:

请注意,systemd 只会在设备需要依赖项时起作用 首先变得活跃。如果它们被添加到已经处于活动状态的设备,它不会对它们起作用

这解释了为什么该add规则触发了 systemd 服务而该remove规则没有触发。

相关内容