运行 每 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
我对 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