【问题标题】:run cron every 105 minutes每 105 分钟运行一次 cron
【发布时间】:2015-03-27 19:22:28
【问题描述】:

我不太擅长 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 分钟。

除了将每一个单独写在一行之外,有没有简单的方法来做到这一点?

任何帮助将不胜感激。

【问题讨论】:

    标签: linux cron


    【解决方案1】:

    不,cron 不能直接这样做。

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

    做数学题留作练习。不要假设你的包装器会准确在一分钟开始; cron 作业计划执行的时间和它实际运行的时间之间可能会有一些延迟,具体取决于系统负载。

    【讨论】:

      【解决方案2】:

      at 非常适合解决这个问题。

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

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

      然后对每个实例使用at -f &lt;script&gt; &lt;time&gt;


      或者使用脚本生成 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
      

      【讨论】:

        猜你喜欢
        • 2019-06-09
        • 2013-11-27
        • 2018-07-17
        • 2016-07-17
        • 2023-04-01
        • 2017-01-24
        • 2014-08-07
        • 2019-07-20
        • 1970-01-01
        相关资源
        最近更新 更多