运行 每 105 分钟执行一次 cron

run cron every 105 minutes

我对 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。

除了将每个单独写在一行之外,还有其他简单的方法吗?

如有任何帮助,我们将不胜感激。

不,cron 不能直接这样做。

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

算术留作练习。不要假设您的包装器会恰好 在一分钟开始;根据系统负载,计划执行 cron 作业的时间与其实际运行的时间之间可能会有一些延迟。

at 很适合解决这个问题。

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

#!/bin/bash
at -f [=10=] now + 105 minutes 
<program>

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


或者使用脚本生成 crontab 条目(我的初稿有点太长,不能写成单行本):

#!/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