我有 systemd 单元文件,我知道它可以通过提供参数在失败时重新启动,例如:
Restart=always
RestartSec=90
每次失败都会在90秒后重新启动,
但是,我只想在系统时间在给定时间范围之间时重新启动,比如在 08:00 和 17:00 之间,然后才重新启动。
有没有办法通过 systemd 做到这一点?
我有 systemd 单元文件,我知道它可以通过提供参数在失败时重新启动,例如:
Restart=always
RestartSec=90
每次失败都会在90秒后重新启动,
但是,我只想在系统时间在给定时间范围之间时重新启动,比如在 08:00 和 17:00 之间,然后才重新启动。
有没有办法通过 systemd 做到这一点?
直接在带有设置的服务单元文件中:否。
使用 Heath Robinson 机制:是的,如下所示。
wibble-in-hours.conf
打开wibble-out-of-hours.conf
这些设置并关闭这些设置。不要忘记章节标题。/etc/systemd/system/wibble.service.d/restart.conf
是这些文件中的一个或另一个。systemd 手册 (qv) 解释了插入目录和片段文件。systemctl daemon-reload
,当然如果服务在非工作时间期间终止,则启动服务。(注意屏蔽、禁用服务,以及一些操作系统在包升级过程中会暂时停止服务,所有这些都使得测试是否启动服务变得不简单。)如果您可以接受重启的间隔不完全是90 秒,并且每次都不完全一样,那么您可以使用服务单元 + 相应的计时器单元以简单的方式实现这一点。
只需让计时器单元在设置中指定您的时间范围
OnCalendar=
。例如,从 08:00 到 16:59 每分钟运行一次(通常在 00 秒,但给 systemd 5 秒的时间来安排它):
此外,在您的服务单元中包含
Restart=no
(或省略Restart=
,因为no
这是默认设置)。此配置将使 systemd 在您的时间范围内每分钟尝试一次启动您的单元。但是,如果设备已经在运行,尝试启动它不会有任何作用。
另一方面,如果设备停止并且计时器触发(在该时间范围内每分钟一次),它将实际上“重新启动”设备。
最终结果是,此计时器将导致设备在停止后在 0 秒到 65 秒之间(计算 5 秒余量)重新启动,但仅在您的时间范围内(因为您的计时器仅在这些时间段内触发。)
如果将 0 作为下限是不可接受的(假设您希望在单元停止然后重新启动之间至少有 30 秒),您可以通过向
ExecStopPost=/bin/sleep 30
服务单元添加一个解决方法来解决此问题。这样,在主服务停止后,单元仍然需要 30 秒才能有效“停止”,因此只有在这 30 秒过去后才有资格从计时器单元重新启动。实际上,这使它在停止后的 30 秒到 95 秒内重新启动。有关如何指定时间间隔的更多详细信息,请参阅systemd.time 的手册页,
OnCalendar=
以便您可以将其调整为重新启动策略中的特定时间要求。感谢您的建议和您的时间。我通过 systemd 服务实现了这一点
Restart=always
以及@JdeBP 建议的两个 crontab 条目