假设我们有一个 crontab 在 RPi 项目上调度一些命令,并且这些命令切换标志的状态。盒子可能会断电,然后重新启动。如果盒子持续工作,我希望标志状态处于正确的状态。
我的想法:
重新启动时有一个任务:
- 恢复已知状态的最后日期(这应该很容易,我可以将日志条目保存在文件中,并且该文件的日期是“最后众所周知的状态日期”)
- 要求 crontab 获取该失效期间将发生的事件列表,并用这些计算新的状态。
- 完成,照常工作:)
请告诉我是否有更明智的方法,如果没有,我该如何实现第 2 点?
答案1
cron
不会给您事件列表。它可以做的是定期启动您的脚本。让脚本执行以下操作:
- 将配置文件中的日期时间戳读入 var X
- 以预先确定的事件间隔(例如 60 分钟)递增 X
- while X < 当前日期时间 执行脚本的其余部分并将 X 写入配置文件并重复 2
- (您可能希望在循环中等待最短时间)
这样,即使机器在运行时出现故障,脚本也会按照您想要的次数切换标志。由于如果日期时间戳文件不早于间隔,则脚本不会执行任何操作,因此您可以从 cron 作业中调用它,其调用频率比其运行的频率要高得多。这样,重新启动后的赶上就不必(平均)在间隔时间的一半之后发生。 (例如安排脚本每五分钟运行一次)。您必须使用锁来防止脚本运行两次(其中一个脚本在断电后试图赶上)。
答案2
为什么不将状态写入非易失性存储,即/var/tmp/status_task_x
并在下次运行时从同一文件读取最后设置的状态?在这种情况下,它应该可以在重新启动后继续存在。
在 crontab 示例中:
* * * * * status_task_x=$(<"/var/tmp/status_task_x") /path/to/run_task_x $status_task_x
让任务脚本将输出写入/var/tmp/status_task_x
答案3
显然这不是一个开箱即用的任务。我在Python中找到了一个库: https://pypi.python.org/pypi/python-crontab 允许为单个工作找到“时间表”:
schedule = job.schedule(date_from=datetime.now())
...
datetime = schedule.get_next()
这正是需要的。从date_from
上次重新启动日期开始循环,但datetime
小于现在。