Systemd 服务在网络接口打开/关闭 (eth0) 时运行

Systemd 服务在网络接口打开/关闭 (eth0) 时运行

我想每次 eth0 上升/下降时运行一个 systemd 服务(可能是一个单独的上升和下降服务)。当插入以太网时,该值应该改变。有人知道如何实现这一点吗?

我可以编写一个 bash 脚本来每隔 X 秒进行轮询,但这可能会消耗比我想要的更多的 CPU,并且实现可能不那么干净。

欢迎任何建议。谢谢!

答案1

以太网上/下事件(以及更多)由内核通过 netlink 套接字报告。您可以使用 来观看消息ip monitor,这可能会在您的 shell 脚本中使用来避免轮询。

我还发现 Debian 至少有一个软件包网络插头,它是一个守护进程,用于侦听 netlink 消息,然后在链接添加、上行和下行上运行 shell 脚本。然后您的 shell 脚本可以用来systemctl启动/停止您的单元。

(据推测,网络管理器和 systemd-networkd 也会侦听这些事件,并且可能有一种方法可以将脚本与它们挂钩 - 但您似乎没有使用它们。)

答案2

在 UBUNTU 服务器上,我通过执行以下操作使 hostapd 服务依赖于 wlp3S0(WLAN)接口:

[Unit]
Wants=network-online.target
BindsTo=sys-subsystem-net-devices-wlp3s0.device
After=sys-subsystem-net-devices-wlp3s0.device
Requires=systemd-networkd.socket
After=systemd-networkd.socket
After=network-online.target

答案3

关于ServerFault的这个问题[Install]表示解决方案就像在自定义服务部分添加一行一样简单:

[Install]
WantedBy=<the appropriate device unit>.device

另一方面,如果您希望在系统网络连接在线时启动服务,无论网络连接是什么类型,然后查看并阅读特定于您的 systemd 版本的man systemd.special使用说明。network-online.target对于我系统上的 systemd 版本,建议的步骤是将其添加到您的服务中:

[Unit]
Wants=network-online.target
After=network-online.target

...但我想我在这里看到了针对不同版本的 systemd 的不同说明,因此请先检查您的发行版man systemd.special

相关内容