如何编写依赖于现有设备的 systemd 服务?

如何编写依赖于现有设备的 systemd 服务?

我想编写一个依赖于 USB WiFi 适配器的 systemd 服务。它不需要在设备插入时启动,只要在设备未插入时不启动即可。我该如何实现这一点?

systemd 配置文件位于[电子邮件保护]格式。它使用占位符%i。所以我尝试将其添加到单元文件中:

[Path]
PathExists = /dev/%i

其中%i应该是类似这样的内容wlan0。不幸的是,这被完全忽略了,所以我可能不理解本节的正确用法。

我也尝试过:

[Unit]
....
BindsTo=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device

我从某个地方(我忘记在哪里)捡到它,而且它也不起作用。

答案1

你需要结合udevsystemd

在 /etc/udev/rules.d/95-mywifi.rules 中为 udev 添加新规则,如下所示:

 ACTION=="add", ATTRS{idVendor}=="...", ATTRS{idProduct}=="...", SYMLINK=="mywifi", TAG+="systemd", ENV{SYSTEMD_WANTS}="[email protected]"

(您必须用适合您的加密狗的供应商和产品代码替换这些点)。

现有的[电子邮件保护]是:

  # cat /lib/systemd/system/netctl-auto\@.service 
  [Unit]
  Description=Automatic wireless network connection using netctl profiles
  Documentation=man:netctl.special(7)
  BindsTo=sys-subsystem-net-devices-%i.device
  After=sys-subsystem-net-devices-%i.device
  Before=network.target
  Wants=network.target

  [Service]
  ExecStart=/usr/bin/netctl-auto start %I
  ExecStop=/usr/bin/netctl-auto stop %I
  RemainAfterExit=yes
  Type=forking

  [Install]
  WantedBy=multi-user.target

为了实现此功能,你必须设置一个网控个人资料,请参阅Arch Linux 维基看看如何做到这一点。

相关内容