安排一个cronjob每2 1/2小时运行一次

时间:2017-08-28 07:04:21

标签: linux cron scheduled-tasks schedule

我想每150分钟运行一次cronjob。可能吗?任何提示都会非常感激。

2 个答案:

答案 0 :(得分:2)

两个cron工作:

00 1,6,11,16,21 * * * /command
30 3,8,13,18,23 * * * /command

或编写一个2.5小时后调用作业的脚本,并每隔5小时调用一次作业和脚本

答案 1 :(得分:0)

您通常可以通过几个单独的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根据最大值运行脚本在差距过去之后你想等待的时间。

例如,假设您对可能延迟五分钟(后续工作在前一个工作后90到95分钟之间运行)感到满意。然后,您将设置cron,以便脚本每五分钟运行一次。