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