我对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分。
除了单独写一行之外,还有一种简单的方法吗?
非常感谢任何帮助。
答案 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