다음 실행까지 남은 시간

다음 실행까지 남은 시간

Cron 일정에서 특정 작업의 다음 실행을 위해 남은 시간을 계산해야 합니다. 작업 빈도가 시간별, 하루 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

공교롭게도 쉘의 내장 %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

한 가지 방법은 전용펄 스크립트

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

관련 정보