在 udev 规则中添加“ENV{SYSTEMD_WANTS}+="your.service”是否可以保证服务将等待设备?

在 udev 规则中添加“ENV{SYSTEMD_WANTS}+="your.service”是否可以保证服务将等待设备?

考虑以下示例。

我有一个服务console-scaling.service,它在启动时调整控制台字体并需要 /dev/fb0 设备。因此,我添加了一条udev规则:

KERNEL=="fb0", SUBSYSTEM=="graphics", TAG+="systemd", ENV{SYSTEMD_WANTS}+="console-scaling.service"

乍一看,这对我来说很有意义,因为它有效地添加了Wanted=dev-fb0.device与服务定义等效的内容。

但什么保证服务不会执行设备已创建?即在Wanted=...添加该子句之前?

答案1

但是如何保证服务在设备创建之前不会执行呢?即在添加 Wanted=... 子句之前?

没有。 WantedBy 不是想要的;他们是两个对面的依赖关系。您要求的是从服务到设备的依赖关系; udev 所做的事情完全相反。

(更准确地说,该条款是不是完全添加到服务中;它是没有用的,因为 [Install] WantedBy 不是“真正的”依赖项。相反,设备单位获得[单位]想要依赖你的服务。)

因此,如果您希望服务需要该设备,请在服务中逐字指定:

[Unit]
Wants=dev-fb0.device   (Requires or even Requisite would be better)
After=dev-fb0.device

允许两个单元相互具有 Wants/Requires 依赖关系,只要它们的订购(即之前/之后)不是循环的。

相关内容