使用 SystemD,我如何使某些服务依赖于某些网络接口的启动?
例如,假设我有一个 802.1ad 绑定接口,在启动之前我需要等待访问我的 SAN/NAS libvirtd
,即使我可以通过不同的接口进行网络访问。或者假设我有一个sshfs
安装座,我想根据 VPN 连接自动启动(并自动拆除)?
处理网络接口的细粒度依赖关系的惯用方法是什么?
目前,我在 Ubuntu 和 CentOS7 上使用 NetworkManager,但我对其他适合平台的网络状态管理机制持开放态度。
答案1
我认为并没有真正建立的标准,但是您可以在systemd
.
分别在 ExecStart= 中的命令之前执行的附加命令。语法与 ExecStart= 相同,不同之处在于允许多个命令行,并且命令按顺序一个接一个地执行。
如果这些命令中的任何一个(不带“-”前缀)失败,则其余命令不会执行,并且该单元被视为失败。
配置当服务进程退出、被终止或超时时是否重新启动服务。
如果设置为 on-failure,当进程以非零退出代码退出、被信号终止(包括核心转储,但不包括上述四个信号)、当某个操作(例如服务reload) 超时,以及触发配置的看门狗超时时。
如果命令返回非零退出代码,则被认为失败,因此通过设置ExecStartPre
来证明您的接口已启动,您可以确保您的服务将需要它。
一些例子:
ExecStartPre=/usr/bin/ping -c 1 ${SAN_IP}
ExecStartPre=/usr/sbin/iscsiadm -m session
我个人喜欢iscsiadm
您的用例的变体。如果存在iscsi连接则返回值为0,否则返回21(这将导致服务失败)。该ping
变体可以用于更广泛的用途,但我想说在大多数情况下您可能需要找到更合适的命令来检查网络状态。ssh
如果您设置了密钥来检查另一台主机上的内容,您甚至可以尝试使用。
重点是ExecStartPre
可以让您根据任何命令使服务失败。只需检查以确保您使用的任何命令都会在您需要时返回非零退出代码(例如cat
ing 一个空文件返回 0,而cat
ing 一个不存在的文件返回 1)
经过一番考虑和提问者的评论后,我会说最好的为服务定义复杂条件的方法是创建另一个服务以供其依赖。
创建一个新服务,使用该命令检查状态ExecStart
。给它Restart=on-failure
。然后制作你原来的服务Require
就After
可以了。
我上面使用的示例ExecStartPre
有点扭曲了其最初的目的,即为服务正常运行进行设置。它仍然可以应用,并且知识仍然有用,所以我将其完好无损地保留下来。