systemctl + Restart=always是什么意思

systemctl + Restart=always是什么意思

我配置了服务 - calc_mem.service

如下

Restart=on-failure
RestartSec=5
StartLimitInterval=400
StartLimitBurst=3

根据我的理解,上面的配置应该执行以下操作

当服务因错误退出时,服务有 3 次重试

服务启动前会等待 5 秒

我还发现“重新启动”也可以是:

Restart=always

我可以理解失败时需要重新启动服务,但这是什么意思 Restart=always

在这种情况下我们需要设置 - Restart=always

答案1

systemd.service手册页有值的描述Restart=,以及什么选项导致重新启动的表格。Always几乎按照盖子上的说明进行操作:

如果设置为always,则无论服务是否干净退出、是否因信号异常终止或超时,服务都将重新启动。

我不确定他们对该功能的想法是什么,但我们可能会假设,例如,服务配置为仅运行固定时间段或服务固定数量的请求,然后停止以避免任何可能的资源泄漏。让 systemd 进行重新启动可以使服务本身的实现更加清晰。

从某种意义上说,我们也可能会问为什么不是将该选项包含在 systemd 中。由于它能够在失败时重新启动服务,因此它们也可能包含重新启动服务的选项总是,以防万一有人需要它。提供工具,而不是政策。

另请注意,此处“成功退出”的定义相当广泛:

如果设置为on-success,则只有当服务进程干净退出时才会重新启动。在这种情况下,干净退出意味着退出代码为 0,或信号SIGHUPSIGINTSIGTERM或之一SIGPIPE[...]

SIGHUP是要求进程重新启动的常见方法,但它未得到处理,它会终止进程。因此,即使服务本身不支持,也可以使用Restart=always(或) 来重新启动。Restart=on-successSIGHUP

另外,据我阅读手册页,并不意味着它会覆盖和always设置的限制:StartLimitIntervalStartLimitBurst

请注意,服务重新启动受StartLimitIntervalSec=和配置的单元启动速率限制的影响StartLimitBurst=,有关详细信息,请参阅 systemd.unit(5)。仅在达到启动限制后,重新启动的服务才会进入失败状态。

答案2

如果设置为故障时,当进程以非零退出代码退出、被信号终止(包括核心转储,但不包括上述四个信号)、操作(例如服务重新加载)超时以及触发配置的看门狗超时时,服务将重新启动。 [...] 如果设置为总是,无论服务是否干净退出、是否因信号异常终止或超时,服务都将重新启动。

摘自https://www.freedesktop.org/software/systemd/man/systemd.service.html

因此,如果您设置on-failure,它不会在干净退出时重新启动。

答案3

@JdeBP 建议有另一种方式来看待这个问题。

Restart=always更简单。更容易实施,更容易理解。为什么我们要检查服务是否以退出代码 0( EXIT_SUCCESS) 终止?服务中甚至可能存在一个奇怪的错误/错误,导致它在不应该这样做时以退出代码 0 终止。

答1:有些单位是不能使用的Restart=always。特别是,如果服务在空闲超时后退出。

有趣的是,如果错误/错误导致此类服务“成功”退出(而本不应该这样做),那也没有那么重要。因为空闲超时意味着服务已经设置为在发出新请求时自动启动。

但是,Restart=on-failure可能用于在某些配置中可以在空闲时退出的服务,但在其他配置中则不能。 systemd-networkd出于这个原因使用它

答案 2:系统管理实践可能包括终止或消息服务进程来阻止它们。有时人们使用简单的kill命令,但也有像apachectl.的优点Restart=on-failuresystemd推荐使用它的风险较小(正如手册页所做的那样)。

然而,systemd处于一个奇怪的位置,他们也支持Restart=always,这就是他们喜欢为项目内大多数长期运行的服务设置的systemd...当您尝试了解systemd服务定义时,这似乎不是很有帮助。

相关内容