如何使用 anacron 安排运行一次?

如何使用 anacron 安排运行一次?

我经常在我的脚本中以以下形式安排稍后的辅助任务:

at now + 8 hours <<< "rm -f workfile.$$ >> $worklog 2>&1 "

或者

at 11pm + $(date +%M) minutes <<< "./postMarketJob.sh $orderID &> $orderID.log"

问题是,有时我用作服务器的笔记本电脑或 PC 在预定时间到来时会关闭,因此在工作中永远不会发生。

同样的问题也适用于定时任务条目。

我试图理解anacron 的手册页对于Ubuntu。

是否有一个工具可以安排一项作业,以便它在被请求时运行,或者在服务器恢复在线时尽快运行?

它不必与anacron, 如果它只是某事可以使用,那么我只需将我的调用包装起来sudo

澄清

这些任务不是一些固定的脚本(如果有的话),而是非常可变的,并且是有条件的,这意味着根据程序中不可预见的情况,它们可能会或一定不会首先被安排。

听起来我可能必须在 atd/anacron 之上开发自己的包装器,为我的程序提供与 类似的界面at,但我希望某些东西已经存在。一直在检查是否fcron符合要求以及是否可以在某些存储库中用于 Ubuntu。

答案1

对于执行一次的作业,at已经完全满足您的要求。随时atd执行所有超过预定日期的预定作业。特别是,在启动时,启动atd会触发其日期在停机期间到期的任何作业的执行。

对于定期作业,您可以组合固定计划 crontab 条目和@rebootcrontab 条目。在@reboot条目中,仅执行过去 24 小时(或您喜欢的任何时间间隔)内未完成的任务。

42 5 * * * /usr/local/bin/myjob && touch /var/myjob/done
@reboot if [ -z "$(find /var/myjob.done -mtime 1)" ]; then /usr/local/bin/myjob && touch /var/myjob/done; fi

答案2

Anacron 非常出色...一个确保作业每次执行的系统数量,重新启动后 - 没有太多控制。此外,它不是常驻守护进程,因此无法替代 crond 或 atd;它在启动时(或手动调用时)启动,在检查某些条件之前等待适当的时间间隔,然后一旦检查或运行所有内容,它就会退出。

也就是说,作为 atd 的备份,它可能对您的情况有所帮助。你可以这样做:
echo '@monthly 0 custom1timejob script_or_cmd_here' >> /etc/anacrontab

然后安排您的 at 作业,确保在脚本中包含一些内容,让 anacron 知道作业已运行(通过执行date +%Y%m%d > /var/spool/anacron/custom1timejob),或者甚至更简单:只需从 anacrontab ( ) 中删除该条目sed -i /custom1timejob/d /etc/anacrontab

然后,最坏的情况是,该作业应该在下次系统启动时运行。
(确保/etc/anacrontab 中的RANDOM_DELAY和变量 [参见],不会扰乱您的期望。)START_HOURS_RANGEman anacrontab

答案3

在这种情况下,batch选择可能at会有所帮助。

在我的沙箱 RHEL5 机器上,我能够在未来两分钟内安排批处理作业,然后停止 atd。我等了五分钟,然后又开始了。当 atd 启动时,批处理作业立即开始。

调用:batch "NOW+2 minutes"或任何可接受的at时间输入。

我确实在 Fedora 16 上尝试此操作时遇到了问题。尽管手册页说它支持时间输入,但该命令报告它不接受任何参数。

相关内容