获取给定开始日期/时间将发生的 crontab 事件

获取给定开始日期/时间将发生的 crontab 事件

假设我们有一个 crontab 在 RPi 项目上调度一些命令,并且这些命令切换标志的状态。盒子可能会断电,然后重新启动。如果盒子持续工作,我希望标志状态处于正确的状态。

我的想法:
重新启动时有一个任务:

  1. 恢复已知状态的最后日期(这应该很容易,我可以将日志条目保存在文件中,并且该文件的日期是“最后众所周知的状态日期”)
  2. 要求 crontab 获取该失效期间将发生的事件列表,并用这些计算新的状态。
  3. 完成,照常工作:)

请告诉我是否有更明智的方法,如果没有,我该如何实现第 2 点?

答案1

cron不会给您事件列表。它可以做的是定期启动您的脚本。让脚本执行以下操作:

  1. 将配置文件中的日期时间戳读入 var X
  2. 以预先确定的事件间隔(例如 60 分钟)递增 X
  3. while X < 当前日期时间 执行脚本的其余部分并将 X 写入配置文件并重复 2
  4. (您可能希望在循环中等待最短时间)

这样,即使机器在运行时出现故障,脚本也会按照您想要的次数切换标志。由于如果日期时间戳文件不早于间隔,则脚本不会执行任何操作,因此您可以从 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小于现在。

相关内容