crontab отчет о том, что выполняется в заданную дату начала и окончания - PullRequest
3 голосов
/ 10 ноября 2009

Существуют ли какие-либо инструменты или отчеты, которые при наличии файла crontab могут выводить, какие задания выполняются в течение указанного периода времени.

Наш файл crontab стал очень большим, и наши системные администраторы пытаются выяснить, какие задания необходимо выполнить повторно, когда мы запланировали время простоя на сервере. Мы пытаемся выяснить, какие работы нам нужно выполнять.

Я планировал написать свой собственный сценарий, но подумал, что там уже что-то есть

Ответы [ 3 ]

1 голос
/ 10 ноября 2009

Существует прекрасное и чистое решение для «режима симуляции» Schedule :: Cron (и для любого другого модуля, использующего режим сна, время, тревогу внутри без изменения самого Schedule :: Cron. дросселирование, например, с

perl -MTime::Mock=throttle,600 schedule.pl

можно ускорить вашу «машину времени» в 600 раз (поэтому вместо 10 минут сна она будет спать только секунду). Пожалуйста, обратитесь к man-странице Time :: Mock для более подробной информации.

Для использования файла crontab напрямую с Schedule :: Cron вы можете взять пример из README напрямую:

 use Schedule::Cron;
 my $cron = new Schedule::Cron(sub { system(shift) },
                               file => "/var/spool/crontab.perl");
 $cron->run();

Хитрость в том, чтобы использовать метод диспетчера по умолчанию, который вызывает system () с сохраненными параметрами. Пожалуйста, дайте мне знать, будет ли это работать для вас или это нужно будет исправить. Конечно, вместо системы вы можете использовать print .

1 голос
/ 10 ноября 2009

Одна вещь, которую вы можете сделать, это:

  • Получить Perl-модуль Расписание :: Cron

  • Измените его на режим сна только по желанию (создайте режим "ускоренной перемотки вперед" и там, где он переходит в режим сна ($ sleep), измените его на бездействие при ускоренной перемотке. Это также потребует изменения $now = time; call для выполнения $now++.

  • Измените его, чтобы иметь возможность указывать время начала и окончания эмуляции.

  • Создает однострочник Perl, который принимает вывод crontab -l и преобразует его в аналогичный contab, но тот, который заменяет команду cmd1 arg1 arg2 подпрограммой perl sub { print "Execution: cmd1 arg1 arg2\n"}

  • Запустите планировщик в режиме ускоренной перемотки, как указано в POD.

    Он будет читать в вашем модифицированном crontab и эмулировать выполнение.

0 голосов
/ 10 ноября 2009

Здесь аналогичен подход к DVK, но с использованием модуля Perl Schedule :: Cron :: Events .

Это очень большая публикация "caveat user" - отправная точка. Учитывая этот файл crontab a_crontab.txt:

59 21 * * 1-5    ls >> $HOME/work/stack_overflow/cron_ls.txt
    # A comment
18 09 * * 1-5    echo "wibble"

Следующий скрипт cron.pl, выполняемый следующим образом, выдает:

$ perl cron.pl a_crontab.txt "2009/11/09 00:00:00" "2009/11/12 00:00:00"
2009/11/09 09:18:00 "echo "wibble""
2009/11/09 21:59:00 "ls >> $HOME/work/stack_overflow/cron_ls.txt"
2009/11/10 09:18:00 "echo "wibble""
2009/11/10 21:59:00 "ls >> $HOME/work/stack_overflow/cron_ls.txt"
2009/11/11 09:18:00 "echo "wibble""
2009/11/11 21:59:00 "ls >> $HOME/work/stack_overflow/cron_ls.txt"
2009/11/12 09:18:00 "echo "wibble""
2009/11/12 21:59:00 "ls >> $HOME/work/stack_overflow/cron_ls.txt"

Прототип (!) Скрипта:

use strict;
use warnings;

use Schedule::Cron::Events;

my $crontab_file = shift || die "! Must provide crontab file name";
my $start_time   = shift || die "! Must provide start time YYYY/MM/DD HH:MM:SS";
my $stop_time    = shift || die "! Must provide stop time YYYY/MM/DD HH:MM:SS";

open my $fh, '<', $crontab_file or die "! Could not open file $crontab_file for reading: $!";
my $table = [];
while ( <$fh> ) { 
    next if /^\s*$/;
    next if /^\s*#/;

    chomp;

    push @$table, new Schedule::Cron::Events( $_, Date => [ smhdmy_from_iso( $start_time ) ] );
}
close $fh;

my $events = [];
for my $cron ( @$table ) {
    my $event_time = $stop_time;
    while ( $event_time le $stop_time ) {
        my ( $sec, $min, $hour, $day, $month, $year ) = $cron->nextEvent;
        $event_time = sprintf q{%4d/%02d/%02d %02d:%02d:%02d}, 1900 + $year, 1 + $month, $day, $hour, $min, $sec;

        push @$events, qq{$event_time "} . $cron->commandLine . q{"};
    }
}

print join( qq{\n}, sort @$events ) . qq{\n};

sub smhdmy_from_iso {
    my $input = shift;

    my ( $y, $m, $d, $H, $M, $S ) = ( $input =~ m=(\d{4})/(\d\d)/(\d\d) (\d\d):(\d\d):(\d\d)= );

     ( $S, $M, $H, $d, --$m, $y - 1900 );
}

Надеюсь, вы сможете адаптироваться к вашим потребностям.

...