我想每次 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
。