我经常在我的脚本中以以下形式安排稍后的辅助任务:
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 条目和@reboot
crontab 条目。在@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_RANGE
man anacrontab
答案3
在这种情况下,batch
选择可能at
会有所帮助。
在我的沙箱 RHEL5 机器上,我能够在未来两分钟内安排批处理作业,然后停止 atd。我等了五分钟,然后又开始了。当 atd 启动时,批处理作业立即开始。
调用:batch "NOW+2 minutes"
或任何可接受的at
时间输入。
我确实在 Fedora 16 上尝试此操作时遇到了问题。尽管手册页说它支持时间输入,但该命令报告它不接受任何参数。