![如何减少等待systemd服务的时间?](https://linux22.com/image/223848/%E5%A6%82%E4%BD%95%E5%87%8F%E5%B0%91%E7%AD%89%E5%BE%85systemd%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%97%B6%E9%97%B4%EF%BC%9F.png)
我有一个 systemd 服务,每次启动时都会更改 mac 地址到 wifi 适配器。 Systemd 服务运行良好。当 wifi 适配器未插入 USB 时,我希望该服务不等待 1m 30sec。
我怎样才能做到这一点?
[Unit]
Description=macchanger on %I
Wants=network-pre.target
Before=network-pre.target
BindsTo=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device
[Service]
ExecStart=/usr/bin/macchanger -r %I
Type=oneshot
[Install]
WantedBy=multi-user.target
答案1
multi-user.target
首先不要将该单元作为依赖项启动。相反,将其作为依赖项启动设备本身的。Udev 规则可用于向设备添加 Wants= 依赖项:
/etc/udev/rules.d/90-macchanger.rules
ACTION!="remove", SUBSYSTEM=="net", KERNEL=="wlan*", ENV{SYSTEMD_WANTS}+="macchanger@$name.service"
这将导致虚拟sys-…-wlan0.device
有[电子邮件受保护],而不是具有相同的 multi-user.target ,因此该服务仅在设备出现时启动。
但如果你这样做,你就不会需要不再是 .service – 您可以直接从 udev 规则运行 macchanger。 (对于长时间运行的服务来说是不可能的,但对于小型助手来说就很好。)
/etc/udev/rules.d/90-macchanger.rules
ACTION!="remove", SUBSYSTEM=="net", KERNEL=="wlan*", RUN+="/bin/macchanger -r $name"
事实上这将是更好的与使用服务相比,它保证在 udev 宣布设备“准备好”使用其他服务之前完成 MAC 更改。