次回の実行までの残り時間

次回の実行までの残り時間

Cron スケジュールでは、特定のジョブの次の実行に残り時間を計算する必要があります。ジョブの頻度が時間ごと、1日3回などのCronがありますが、特定の日付/日付でジョブが実行されません。 HH:MM:SSの場合、/var/spool/cron/RHELにも確認するアクセス権がありません。ジョブがで始まる場合9:30

30 9* * * /some/job.sh
-bash-3.2$ 日付+"%H:%M"
13:52

出力が必要です。19 Hours and 38 Minutes現在のシステム時間から次の実行が発生するまでの合計時間をどのように知ることができますか?秒の計算は、作業時間のみを意味します。

答え1

cronいつ解雇されるかわからない職場。それがすることは、crontab毎分すべての項目を確認し、一致する項目を実行することだけです"$(date '+%M %H %d %m %w')"

あなたができることは、今から49時間の間にすべてのタイムスタンプを作成し(DSTの変更を考慮して)手動で一致を実行し(トリッキーな部分)、最初に一致するタイムスタンプを報告することです。

またはあなたは使用することができますクロニット python基準寸法:

python -c '
from croniter import croniter
from datetime import datetime
iter = croniter("3 9 * * *", datetime.now())
print(iter.get_next(datetime))'

遅延の場合:

$ faketime 13:52:00 python -c '
from croniter import croniter
from datetime import datetime
d = datetime.now()
iter = croniter("30 9 * * *", d)
print iter.get_next(datetime) - d'
19:37:59.413956

ただし、DSTの変更による潜在的なリスクに注意してください。

$ faketime '2015-03-28 01:01:00' python -c '
from croniter import croniter
from datetime import datetime
iter = croniter("1 1 * * *", datetime.now())
print iter.get_next(datetime)'
2015-03-29 02:01:00

$ FAKETIME_FMT=%s faketime -f 1445734799 date
Sun 25 Oct 01:59:59 BST 2015
$ FAKETIME_FMT=%s faketime -f 1445734799  python -c '
from croniter import croniter
from datetime import datetime
iter = croniter("1 1 * * *", datetime.now())
print iter.get_next(datetime)'
2015-10-25 01:01:00

$ FAKETIME_FMT=%s faketime -f 1445734799 python -c '
from croniter import croniter
from datetime import datetime
d = datetime.now()
iter = croniter("1 1 * * *", d)
print iter.get_next(datetime) - d'
-1 day, 23:01:01

cron時間が経つにつれてタスクが 2 回実行されるのを防ぐか、時間が進むと交互にスキップされたタスクが実行されないようにすることで、この問題を自己解決できます。

答え2

偶然にも、シェルの組み込み%T形式は以下をサポートします。printfksh93標準crontab仕様入力として。

$ ksh93 -c 'printf "%(%F %T)T\n" now "30 9 * * *"'
2017-11-07 17:06:41
2017-11-08 09:30:00

そのため、数秒でデルタを取得できます。

#! /bin/ksh93 -
crontab_line='30 9 * * *'
delta=$(($(printf '(%(%s)T - %(%s)T) / 60' "$crontab_line" now)))
echo "Next run in $((delta/60)) hours and $((delta%60)) minutes."

*/5月/日名や曜日7など、(ほとんどの)cron実装で時々サポートされるいくつかの拡張はサポートされていません@reboot@hourly

答え3

一つの方法は専用ですPerlスクリプト

#!/usr/local/bin/perl -w
use strict;
use lib './lib';
use Schedule::Cron::Events;
use Getopt::Std;
use Time::Local;
use vars qw($opt_f $opt_h $opt_p);
getopts('p:f:h');

if ($opt_h) { usage(); }
my $filename = shift || usage();

my $future = 2;
if (defined $opt_f) { $future = $opt_f; }
my $past = 0;
if (defined $opt_p) { $past = $opt_p; }

open (IN, '<$filename') || die "Unable to open '$filename' for read: $!";
while(<IN>) {
    my $obj = new Schedule::Cron::Events($_) || next;
    chomp;
    print "# Original line: $_\n";

    if ($future) {
        for (1..$future) {
                my $date = localtime( timelocal($obj->nextEvent) );
                print "$date - predicted future event\n";
        }
    }
    $obj->resetCounter;
    if ($past) {
        for (1..$past) {
                my $date = localtime( timelocal($obj->previousEvent) );
                print "$date - predicted past event\n";
        }
    }
    print "\n";
}
close IN;


sub usage {
    print qq{
SYNOPSIS

$0 [ -h ] [ -f number ] [ -p number ] <crontab-filename>

Reads the crontab specified and iterates over every line in it, predicting when 
each cron event in the crontab will run. Defaults to predicting the next 2 events.

    -h - show this help
    -f - how many events predited in the future. Default is 2
    -p - how many events predicted for the past. Default is 0.

EXAMPLE

$0 -f 2 -p 2 ~/my.crontab

\$Revision\$

};
    exit;
}

=pod

=head1 NAME

cron_event_predict - Reads a crontab file and predicts when event will/would have run

=head1 SYNOPSIS

cron_event_predict.plx [ -h ] [ -f number ] [ -p number ] <crontab-filename>

=head1 DESCRIPTION

A simple utility program mainly written to provide a worked example of how to use the module,
but also of some use in understanding complex or unfamiliar crontab files.

Reads the crontab specified and iterates over every line in it, predicting when 
each cron event in the crontab will run. Defaults to predicting the next 2 events.

These are the command line arguments:

    -h - show this help
    -f - how many events predited in the future. Default is 2
    -p - how many events predicted for the past. Default is 0.

Here's an example, showing the default of the next 2 predicted occurences of the each cron job:

    dev~/src/cronevent > ./cron_event_predict.plx ~/bin/crontab
    # Original line: 1-56/5 * * * * /usr/local/mrtg-2/bin/mrtg /home/admin/mrtg/mrtg.cfg
    Thu Sep 26 00:41:00 2002 - predicted future event
    Thu Sep 26 00:46:00 2002 - predicted future event
    
    # Original line: 34 */2 * * * /home/analog/analogwrap.bash > /dev/null
    Thu Sep 26 02:34:00 2002 - predicted future event
    Thu Sep 26 04:34:00 2002 - predicted future event
    
    # Original line: 38 18 * * * /home/admin/bin/allpodscript.bash > /dev/null
    Thu Sep 26 18:38:00 2002 - predicted future event
    Fri Sep 27 18:38:00 2002 - predicted future event

And here's an example showing past events too:

    dev~/src/cronevent > ./cron_event_predict.plx -f 1 -p 3 ~/bin/crontab
    # Original line: 1-56/5 * * * * /usr/local/mrtg-2/bin/mrtg /home/admin/mrtg/mrtg.cfg
    Thu Sep 26 00:41:00 2002 - predicted future event
    Thu Sep 26 00:36:00 2002 - predicted past event
    Thu Sep 26 00:31:00 2002 - predicted past event
    Thu Sep 26 00:26:00 2002 - predicted past event
    
    # Original line: 34 */2 * * * /home/analog/analogwrap.bash > /dev/null
    Thu Sep 26 02:34:00 2002 - predicted future event
    Thu Sep 26 00:34:00 2002 - predicted past event
    Wed Sep 25 22:34:00 2002 - predicted past event
    Wed Sep 25 20:34:00 2002 - predicted past event
    
    # Original line: 38 18 * * * /home/admin/bin/allpodscript.bash > /dev/null
    Thu Sep 26 18:38:00 2002 - predicted future event
    Wed Sep 25 18:38:00 2002 - predicted past event
    Tue Sep 24 18:38:00 2002 - predicted past event
    Mon Sep 23 18:38:00 2002 - predicted past event

使用法

crontab -l | perl cron_event_predict.plx /dev/stdin

または

crontab -l > /tmp/crontab
perl cron_event_predict.plx /tmp/crontab

はい

# Original line: 10,16,30,50 * * * * /path/to/script.bash
Sat Jan  7 08:50:00 2023 - predicted future event
Sat Jan  7 09:10:00 2023 - predicted future event

関連情報