【发布时间】:2018-02-05 09:27:50
【问题描述】:
我想每 150 分钟运行一次 cronjob。可能吗?任何提示将不胜感激。
【问题讨论】:
-
我的错。我的意思是每 150 分钟。
-
安排它每两个小时运行一次可能更简单。
标签: linux cron scheduled-tasks schedule
我想每 150 分钟运行一次 cronjob。可能吗?任何提示将不胜感激。
【问题讨论】:
标签: linux cron scheduled-tasks schedule
两个 cron 作业:
00 1,6,11,16,21 * * * /command
30 3,8,13,18,23 * * * /command
或编写一个脚本,在 2.5 小时后调用作业,并每 5 小时调用一次作业和您的脚本
【讨论】:
23:30 和 01:00 之间只有 1.5 小时。
您通常可以通过几个单独的 crontab 条目轻松完成此操作,一个用于五小时工作,另一个用于中间工作:
0 0,5,10,15,20 ...
30 2,7,12,17,22 ...
请记住,一天的最后一份工作与第二天的第一份工作之间的差距只有一个半小时(2.5 不能平均分为 24)。
如果您真的需要两个半小时的间隔,您可以根据需要随时运行您的工作,但只执行 有效负载需要时说的工作。
执行此操作的一种方法是使用状态文件来维护有效负载上次运行的时间,然后仅在经过一段合适的时间后才运行有效负载。例如,此脚本将仅每 7 秒运行一次有效负载(最后的 echo),无论该脚本被调用的频率如何:
#!/bin/bash
# Configuration items.
stateFile=/tmp/lastTime.txt # File holding time of last payload run.
minGap=7 # How often payload should run (seconds).
# Get last payload run time (with checks for non-valid data).
((lastTime = 0))
[[ -f ${stateFile} ]] && lastTime="$(cat ${stateFile})"
[[ "${lastTime}" =~ [1-9][0-9]* ]] || ((lastTime = 0))
# Exit if not enough time elapsed, else update last payload run time.
thisTime=$(date +%s)
((timeGap = thisTime - lastTime))
[[ ${timeGap} -lt ${minGap} ]] && exit
echo ${thisTime} >${stateFile}
# This is the payload section, put whatever code you want here.
echo "[${lastTime}] [${thisTime}] [${timeGap}]"
假设您已调用该脚本 runme.sh,您可以使用以下命令对其进行测试:
while true ; do ./runme.sh ; sleep 1 ; done
这将每秒运行一次,但您会注意到负载仅每 7 秒执行一次(第一次除外),正如预期的那样:
[0] [1503908311] [1503908311]
[1503908311] [1503908318] [7]
[1503908318] [1503908325] [7]
[1503908325] [1503908332] [7]
[1503908332] [1503908339] [7]
[1503908339] [1503908346] [7]
[1503908346] [1503908353] [7]
对于您的特定情况,您可以将 minGap 设置为 9000(两个半小时,以秒为单位)并让 cron 根据您的最大时间运行脚本'希望在间隙过去后等待。
例如,假设您对 5 分钟的潜在延迟感到满意(后续作业在前一个作业之后的 90 到 95 分钟之间运行)。然后,您将设置 cron,以便脚本每五分钟运行一次。
【讨论】: