每105分钟运行一次cron

时间:2015-01-28 18:42:10

标签: linux cron

我对Linux不太满意,如果这很容易,我道歉。

我需要每隔15分钟通过cron运行7个不同的脚本。我已经知道每个脚本需要每105分钟(每1小时45分钟)运行一次,如下所示:

Script 1    Script 2    Script 3    Script 4    Script 5    Script 6    Script 7
00:15       00:30       00:45       01:00       01:15       01:30       01:45
02:00       02:15       02:30       02:45       03:00       03:15       03:30

等...

现在我知道我不能这样说:

*/105 * * * * something

因为会议纪要最多只能达到59分。

除了单独写一行之外,还有一种简单的方法吗?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

不,cron无法直接执行此操作。

您可以做的是每15分钟运行一次cron作业,调用包装器脚本。包装器脚本可以查询当前时间并确定要执行的7个脚本中的哪一个。

做数学是一项练习。不要以为你的包装器会在最开始时完全 。在计划执行cron作业的时间与实际运行的时间之间可能存在一些延迟,具体取决于系统负载。

答案 1 :(得分:1)

at是这个问题的一个很好的候选人。

写一个包装器(或构建到你的脚本中):

#!/bin/bash
at -f $0 now + 105 minutes 
<program>

然后对每个实例使用at -f <script> <time>


或使用脚本生成crontab条目(我的第一个草稿有点太长而无法成为oneliner):

#!/usr/bin/perl -Ws
use strict;
use DateTime;
our ($period, $offset, $command);
my ($offh, $offm) = split(/:/, $offset || '0:00');
my %crontab = ();
for (my $i = 0; $i < 1440; $i += $period) {
    my ($h,$m) = split /:/, 'DateTime'->today->set('hour', $offh, 'minute', $offm)->add('minutes', $i)->hms;
    $crontab{$m}{$h}++;
}
printf("%02d %-15s * * *\t%s\n", $_, join(',', sort keys %{$crontab{$_}}), $command) for sort keys %crontab;

用法:

$ ./gencrontab -period=105 -offset=1:30 -command=myprogram
00 05,12,19        * * *    myprogram
15 00,03,10,17     * * *    myprogram
30 01,08,15,22     * * *    myprogram
45 06,13,20        * * *    myprogram