我有一个非常奇怪的问题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 秒内将无法启动。