在 systemd 中的进程停止和启动之间添加延迟

在 systemd 中的进程停止和启动之间添加延迟

我有一个非常奇怪的问题systemd。当我发出一个消息时,systemctl restart它将在前一个进程完成之前启动新进程。

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

有什么办法可以在进程的停止和开始之间添加延迟吗?

答案1

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

[Service]
Restart=always
RestartSec=30

检查此链接了解更多示例。

答案2

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 restart B,它会按预期工作...但如果您执行 systemctl restart A,两个服务都会停止并立即再次启动,没有延迟。

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

这并不像听起来那么罕见。如果B与远程服务器对话,快速启动和停止可能会由于远程端拒绝客户端而失败。但是只要 A 更新而 B 没有更改,就会直接重新启动 A。

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

答案3

您可以使用ExecStopPost,它允许在服务停止后运行命令:

ExecStopPost=/bin/sleep 5

那么服务每次停止后(包括手动重启或者服务杀掉)都会等待5秒。停止后 5 秒内将无法启动。

相关内容