我配置了服务- calc_mem.service
如下所示
Restart=on-failure
RestartSec=5
StartLimitInterval=400
StartLimitBurst=3根据我的理解,上面的配置应该完成以下操作
。
我还发现,“重新启动”也可以:
Restart=always我可以理解在服务失败时重新启动服务的必要性,但是Restart=always的含义是什么?
在这种情况下,我们需要设置- Restart=always。
发布于 2019-03-22 09:06:37
systemd.service手册页对Restart=所接受的值进行了描述,并提供了导致何时重新启动的选项表。Always几乎按照它在盖子上说的做:
如果设置为
always,服务将被重新启动,无论它是否干净地退出,是否被信号异常终止,或者是否触发超时。
我不确定他们对这个特性的想法是什么,但是我们可能假设一个服务被配置成只运行一段固定的时间或服务固定数量的请求,然后停止以避免任何可能的资源泄漏。让systemd进行重新启动可以使服务本身有一个更清晰的实现。
在某种意义上,我们可能还会问,为什么不将该选项包括在systemd中。由于它能够在失败时重新启动服务,因此它们可能还包括始终重新启动服务的选项,以防有人需要它。提供工具,而不是策略。
还请注意,此处对“成功退出”的定义相当宽泛:
如果设置为
on-success,则只有在服务流程干净退出时才会重新启动。在这种情况下,干净的出口意味着退出代码为0,或信号SIGHUP、SIGINT、SIGTERM或SIGPIPE、...之一。
SIGHUP是请求进程重新启动的一种常见方式,但是如果没有处理,它就会终止该进程。因此,拥有Restart=always (或Restart=on-success)允许使用SIGHUP重新启动,即使没有支持它的服务本身。
此外,就我所能阅读的手册页而言,always并不意味着它将覆盖StartLimitInterval和StartLimitBurst设置的限制:
请注意,服务重新启动取决于使用
StartLimitIntervalSec=和StartLimitBurst=配置的单元启动速率限制,有关详细信息,请参阅systemd.unit(5)。重新启动的服务只有在达到开始限制后才进入失败状态。
发布于 2019-03-22 08:55:26
如果设置为on-failure,则当进程以非零退出代码退出时,服务将被一个信号(包括核心转储,但不包括上述四个信号)、操作(例如服务重新加载)超时和触发配置的看门狗超时而终止时重新启动。如果...设置为“始终”,则不管服务是否干净地退出、是否被信号异常终止或触发超时,服务都将重新启动。
https://www.freedesktop.org/software/systemd/man/systemd.service.html摘录
因此,如果您设置了on-failure,它将不会在干净退出时重新启动。
发布于 2019-03-22 10:28:05
@JdeBP提出了另一种看待这个问题的方法。
Restart=always更简单。更容易实现,更容易理解。为什么我们要检查服务是否以退出代码0 (EXIT_SUCCESS)结束?服务中甚至可能有一个奇怪的错误/错误,这导致它在不应该这样做的情况下以退出代码0终止。
答1:有些单位不能使用Restart=always。特别是,如果服务在空闲超时后退出。
有趣的是,如果一个错误/错误导致这样一个服务“成功地”退出,那么它就不会那么重要了,而它不应该这样做。因为空闲超时意味着服务已经设置为在发出新请求时自动启动。
但是,Restart=on-failure可能用于某些配置中可以在空闲状态下退出的服务,但在其他配置中则不能。systemd-networkd因为这个原因使用它。
回答2:系统管理实践可能包括杀死或发送消息服务流程来阻止它们。有时人们使用普通的kill命令,但也有类似于apachectl的脚本。Restart=on-failure的优点是systemd推荐使用它的风险较小(就像手册页所做的那样)。
然而,systemd处于一个奇怪的位置,他们也支持Restart=always,这也是他们喜欢为systemd项目中大多数长期运行的服务设置的.当您试图了解systemd服务定义时,这似乎没有多大帮助。
https://unix.stackexchange.com/questions/507911
复制相似问题