当插入给定的USB设备(以太网加密狗)时,如何启动systemd服务?

索尼2

我有一个用于以太网访问的USB以太网加密狗,但netctl-ifplugd@...插入时希望自动启动。(不要与插入以太网电缆混淆-由处理netctl-ifplugd)。如何使这种情况发生?

我已经看过如何编写依赖于存在的设备的systemd服务?但这似乎并不是将其插入,而仅仅是将其存在。

用户名

我看过“如何编写依赖于存在的设备的systemd服务?” 但这似乎并不是将其插入,而仅仅是将其存在。

这非常相似,只是您需要相反的依赖关系:您希望虚拟设备单元依赖于您的服务,而不是依赖于设备(或者除了服务之外),取决于虚拟设备

实际上,尽管链接问题的标题似乎提出了相反的要求,但是线程中可接受的答案已经记录了使设备启动服务的确切方法之一(udev-rule方法)。

但是,如果您具有确切的.device单位名称,则直接使用systemd依赖项会更简单:

如果知道确切的sysfs路径:

例如,您确定设备为sys-subsystem-net-devices-usb0.device您可以使用各种方式来扩展该单元(尽管它是虚拟的),例如直接foo.device.d/*.conf插入或foo.device.wants/符号链接(其工作方式与multi-user.target.wants /相同)。

  • 您可以[Install]在服务中添加配置,然后systemctl启用它:

    [Install]
    WantedBy=sys-subsystem-net-devices-%i.device
    
  • 或者,您可以直接通过获得相同的结果systemctl add-wants

    # systemctl add-wants sys-subsystem-net-devices-usb0.device [email protected]
    
  • 两种方法都只会产生一个可以通过手动建立的符号链接ln -s

对于用户单元,这通常是相同的。

如果仅知道部分名称(或其他属性的某种组合):

编写与您的设备匹配的udev规则(确切的udev规则语法不在此处范围内),并设置它SYSTEMD_WANTS指示您的设备udev属性(即“设备环境变量”):

ACTION=="add", SUBSYSTEM=="net", KERNEL=="usb*", ENV{SYSTEMD_WANTS}+="netctl-ifplugd@%k.service"

由于所有*.rules文件都是按字母顺序处理的,因此请确保将规则放置在systemd自己的“持久网络接口”规则之后。

如果您使用,则适用于用户单位ENV{SYSTEMD_USER_WANTS}


您可能会想RUN+="/bin/systemctl start foo"通过udev使用它不要那样做 但是,如果这样做,则至少要使用该systemctl --no-block选项,以免在两个组件之间造成可能的死锁。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章