systemctl 应该停止尊重 Restart=always 吗?

systemctl 应该停止尊重 Restart=always 吗?

当执行“systemctl stop docker.service”时,是否/应该遵守“Restart=always”?

我的理解(这是有限的)是 systemctl stop 应该以退出代码 0 停止。然后我希望 docker.service 重新启动,因为配置了“Restart=always”,即无论退出代码是什么都应该重新启动它,但是这似乎不会发生。

systemctl stop 是一种特殊情况吗?如果是这样,我如何通过让 dockerd 以状态代码 0 退出来测试“Restart=always”是否正常工作?

答案1

感谢您的评论,非常感谢。摆弄上面的内容(基于我缺乏知识的最佳描述),我认为这种行为是:

  • 上面的 Eval/gdp 脚本似乎适用于 docker.service。它会导致 dockerd 进程退出并重新启动。没有消息写入 /var/log/messages 来表明进程已退出且状态为零。如果我将脚本更改为使用退出状态 1,则会将其作为状态=1 写入消息日志文件,并且服务也会重新启动
  • SIGTERM 还会导致 docker.service 停止,没有退出代码状态写入 /var/log/messages 并重新启动进程
  • systemctl stop docker.service 导致进程停止并且不重新启动
  • systemctl stop systemd-udevd 导致进程停止并且不会重新启动,即它就像 SIGSTOP

最后一点似乎表明 STOP 命令在设计上不支持 restart=always。

答案2

不,是的。我不确定。

对于与 libc 链接的程序,例如 udev:

eval $(systemctl show -p MainPID systemd-udevd)
gdb -p $MainPID
p (void)_exit(0)
quit

然而 Docker 是用 编写的go,这对于调用 C 函数非常不友好(并且可能使用它自己的系统调用实现?)。所以我不知道这是否适用于 dockerd。

如果您只是想仔细检查它Restart=always是否按照您的想法工作,systemd-udevd.service 已经使用了Restart=always。所以你可以Restart=always使用上面的内容进行演示。它对我有用:-)。

相关内容