如何编写依赖于存在设备的 systemd 服务?

9 linux usb arch-linux systemd

我想编写一个依赖于 USB WiFi 加密狗存在的 systemd 服务。只要在设备未插入时它不启动,它就不需要在设备插入时启动。我怎样才能做到这一点?

systemd 配置文件采用 network@.conf 格式。它使用%i占位符。所以我尝试将其添加到单元文件中:

[Path]
PathExists = /dev/%i
Run Code Online (Sandbox Code Playgroud)

哪里%i会有类似的东西wlan0。不幸的是,这完全被忽略了,所以我可能不明白这一节的正确用法。

我也试过:

[Unit]
....
BindsTo=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device
Run Code Online (Sandbox Code Playgroud)

我是从某个地方捡到的(我忘了在哪里),这也不起作用。

Mar*_*iae 9

您需要结合udevsystemd

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

 ACTION=="add", ATTRS{idVendor}=="...", ATTRS{idProduct}=="...", SYMLINK=="mywifi", TAG+="systemd", ENV{SYSTEMD_WANTS}="netctl-auto@mywifi.service"
Run Code Online (Sandbox Code Playgroud)

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

现有的netctl-auto@.service是:

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

为此,您必须设置netctl配置文件,请参阅Arch Linux Wiki以了解如何执行此操作。

  • 我没有足够的代表来评论已接受的答案,我知道这有点死灵,但要扩展答案:我有一个基于 MariusMatutiaes 的工作规则:ACTION==“add”,SUBSYSTEM==“ net", KERNEL=="wlan[1-9]", TAG+="systemd", ENV{SYSTEMD_WANTS}="netctl-auto@$name.service" 我不确定它是否更好,但我认为是因为它不使用符号链接。 (2认同)