首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使某些服务依赖于某些接口?

如何使某些服务依赖于某些接口?
EN

Unix & Linux用户
提问于 2017-04-23 10:44:54
回答 1查看 388关注 0票数 3

有了SystemD,我如何使某些服务依赖于某些网络接口的启动?

例如,假设我有一个802.1ad键接口,我需要等待访问我的SAN/NAS,然后才能打开libvirtd,尽管我可能可以通过另一个接口访问网络。或者,假设我有一个sshfs挂载,我想要自动地(并被自动拆下)依赖于一个VPN连接?

处理网络接口上细粒度依赖关系的惯用方法是什么?

目前,我正在Ubuntu和CentOS7上使用CentOS7,但我对其他平台开放--管理网络状态的适当机制。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2017-04-26 21:51:46

我不认为有一个标准是以某种方式构建的,但是在systemd中有一些东西是可以利用的。

ExecStartPre=

在...之前执行的附加命令-- ExecStart=中的命令。语法与ExecStart=相同,只是允许多个命令行,并依次执行命令。如果这些命令中的任何一个(没有以“-”作为前缀)失败,则其余的命令都不会执行,并且该单元被认为失败。

重新启动=故障

配置服务流程退出、终止或到达超时时是否重新启动服务。如果设置为on-failure,则当进程以非零退出代码退出时,服务将被一个信号(包括核心转储,但不包括上述四个信号)、操作(例如服务重新加载)超时和触发配置的看门狗超时而终止时重新启动。

如果命令返回非零退出代码,则被认为是失败的,因此,通过将ExecStartPre设置为可以证明您的接口已打开的东西,您可以确保您的服务将需要它。

下面是一些例子:

代码语言:javascript
复制
ExecStartPre=/usr/bin/ping -c 1 ${SAN_IP}

ExecStartPre=/usr/sbin/iscsiadm -m session

我个人喜欢用例的iscsiadm变体。如果有iscsi连接,则返回值为0,否则返回21 (这将导致服务失败)。ping变体可以用于多种用途,但我想说,在大多数情况下,您可能希望找到一个更合适的命令来检查网络状态。您甚至可以尝试使用ssh,如果您有键设置,以检查其他主机上的东西。

关键是ExecStartPre可以让您的服务基于任何命令而失败。只需检查以确保您使用的任何命令都会在需要时返回非零退出代码(例如,对空文件的cat返回0,而对不存在的文件的cat返回1)。

经过一些考虑和请求者的评论之后,我想说,定义服务复杂条件的最好方法是创建另一个服务,供其依赖。

创建一个使用该命令检查状态为ExecStart的新服务。给它Restart=on-failure。然后使您的原始服务RequireAfter它。

上面我使用的ExecStartPre示例有点扭曲了它的最初用途,即为服务正常运行设置设置。它仍然适用,知识仍然是有用的,所以我把它完好无损。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/360757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档