【发布时间】:2010-11-27 21:00:08
【问题描述】:
如何设置每 25 小时运行一次的 cronjob?
【问题讨论】:
-
这样做的目的是什么?为什么不能接受 24 小时?
-
来自 Google 的合法用例是为了避免超过对时间不是特别敏感的定期作业的每日 API 限制。为了保守起见,增加一个额外的小时并避免夏令时错误。
标签: cron
如何设置每 25 小时运行一次的 cronjob?
【问题讨论】:
标签: cron
如果您计算自Epoch 以来的小时数(、分钟、天或周),您可以实现任何频率,在脚本顶部添加条件,并将脚本设置为在您的 crontab 上每小时运行一次:
#!/bin/bash
hoursSinceEpoch=$(($(date +'%s / 60 / 60')))
# every 25 hours
if [[ $(($hoursSinceEpoch % 25)) -ne 0 ]]; then
exit 0
fi
date(1) 返回当前日期,我们将其格式化为自 Epoch (%s) 以来的秒数,然后我们进行基本数学运算:
# .---------------------- bash command substitution
# |.--------------------- bash arithmetic expansion
# || .------------------- bash command substitution
# || | .---------------- date command
# || | | .------------ FORMAT argument
# || | | | .----- formula to calculate minutes/hours/days/etc is included into the format string passed to date command
# || | | | |
# ** * * * *
$(($(date +'%s / 60')))
# * * ---------------
# | | |
# | | ·----------- date should result in something like "1438390397 / 60"
# | ·-------------------- it gets evaluated as an expression. (the maths)
# ·---------------------- and we can store it
您可以将此方法用于每分钟、每小时、每天或每月的 cron 作业:
#!/bin/bash
# We can get the
minutes=$(($(date +'%s / 60')))
hours=$(($(date +'%s / 60 / 60')))
days=$(($(date +'%s / 60 / 60 / 24')))
weeks=$(($(date +'%s / 60 / 60 / 24 / 7')))
# or even
moons=$(($(date +'%s / 60 / 60 / 24 / 656')))
# passed since Epoch and define a frequency
# let's say, every 13 days
if [[ $(($days % 13)) -ne 0 ]]; then
exit 0
fi
# and your actual script starts here
【讨论】:
我觉得你应该试试这个
0 */25 * * * ...
【讨论】:
设置一个每小时的工作,如果 25 小时过去了,则使用此 snipnet 签入您的脚本:
if [ $((((`date +%s` - (`date +%s` % 3600))/3600) % 25)) -eq 0 ] ; then
your script
fi
【讨论】:
您可以使用“睡眠”或“观看”命令让脚本循环运行。只要确保你的脚本被执行。
【讨论】:
当您启动当前作业时,发出 at 命令指定下一个作业的时间和日期会更容易,但您可以通过在开始时更新进程的 cronjob 条目来使用 cronjob 模拟它当前运行(不是在最后,因为你必须考虑运行作业的时间)。
【讨论】:
at 技巧可能会失败,例如,如果系统在计划运行时出现故障。
只是猜测,但你没有
我头脑中的最佳技巧:编写一个脚本来跟踪它的最后一次运行时间,如果超过 25 小时,则有条件地运行它。
Cron 驱动程序脚本每小时运行一次。
【讨论】: