在systemd中增加进程停止和开始之间的延迟


10

我有一个非常奇怪的问题systemd。当我发出时systemctl restart,它将在上一个完成之前开始新的过程。

这可以在日志中看到,在启动消息(“打开日志”)之后记录了最终关闭消息(“关闭日志”)。

有什么方法可以在停止和开始过程之间增加延迟吗?


没什么能阻止您的奔跑systemctl stop myservice && sleep 3 && systemctl start myservice
don_crissti

为什么这么奇怪?这是一项设计功能,可让您独自解决现实世界中的问题。在单元启动时注入睡眠,或使用ExecPre条件确保旧实例完全消失。
Florian Heigl

Answers:


13

在您的systemd服务文件中,您可以设置RestartSec选项以添加重新启动延迟。请参见下面的示例:

[Service]
Restart=always
RestartSec=30

检查此链接以获取更多示例。


1
afaik RestartSec仅适用于使用该Restart=指令配置的服务,而在进行systemctl restart someservice
don_crissti

1

RestartSec似乎仅在该特定服务是通过systemctl restart命令重新启动的服务时使用。

例如,我有两个服务,A和B。

[Unit]
Requires=network-online.target
[Service]
ExecStart=A-stuff
Restart=always

[Unit]
Requires=A.service
After=A.service
[Service]
ExecStart=B-stuff
Restart=always
RestartSec=30

如果您执行systemctl重新启动B,它将按预期方式工作...但是,如果您执行systemctl重新启动A,则两个服务都将立即停止并且立即重新启动,而不会出现延迟。

显然,Systemd仅使用您指定的一项服务的配置值,而忽略它们的任何依赖关系。

这听起来并不罕见。如果B与远程服务器通信,则由于远程端拒绝客户端,快速启动和停止可能会失败。但是,只要在不更改B的情况下更新A,就会直接重启A。

您可能也可以通过向A添加延迟来解决此问题,但是您不必这样做,因为当它不是依赖项时,它会通过使A了解B来破坏对象隔离。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.