![使用 systemd 脚本中的 chrony 更新时间(某些应用程序重新启动)?](https://linux22.com/image/197475/%E4%BD%BF%E7%94%A8%20systemd%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E7%9A%84%20chrony%20%E6%9B%B4%E6%96%B0%E6%97%B6%E9%97%B4%EF%BC%88%E6%9F%90%E4%BA%9B%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E9%87%8D%E6%96%B0%E5%90%AF%E5%8A%A8%EF%BC%89%EF%BC%9F.png)
如果我的托管服务商将我的虚拟机移至另一台主机,则本地时间会漂移(最多 3 秒)。 Chrony 能够解决这个问题,但需要很长时间才能意识到。在此期间,我的数据库节点(CockroachDB)由于时间差(允许最大0.5秒)而关闭。然后,我的 systemd 脚本重新启动它。
现在我希望 systemd 脚本首先确定更新时间。所以我将其添加到我的 /etc/systemd/system/cockroach.service脚本:
ExecStartPre=-/usr/bin/chronyc -a makestep
但这给了我错误 501(缺少授权),因为我的 systemd 脚本以用户“cockroach”运行,并且 chrony 守护进程仅接受来自用户 root 或 chrony (UDP) 的消息。
现在我被困住了。有没有办法让 chrony 也从 cockroach 用户那里获取消息?或任何其他选项使其现在同步时间(chrony 正在运行,因此无法手动更新)。
答案1
解决方案是使用“+”语法执行开始前范围。下面执行的是慢性具有 root 权限 (+) 的可执行文件,并忽略此调用可能发生的任何错误 (-):
ExecStartPre=-+/usr/bin/chronyc -a makestep
这对我来说效果很好。
您可以在 systemd 文档中找到这些前缀的文档执行启动这里的参数:https://www.freedesktop.org/software/systemd/man/systemd.service.html#ExecStart=