2009-11-09 8 views
3

Existe-t-il des outils ou des rapports indiquant qu'un fichier crontab peut générer les travaux qui s'exécutent dans un laps de temps spécifié. Notre fichier crontab est devenu très volumineux et nos administrateurs système ont du mal à trouver quels travaux doivent être réexécutés lorsque nous avons programmé un temps d'arrêt sur le serveur. Nous essayons de déterminer quels emplois nous devons exécuter.Rapport crontab de ce qui s'exécute dans un datetime de début et de fin spécifié

Je comptais écrire mon propre script, mais se demandant s'il y avait quelque chose là-bas déjà

Répondre

1

Une chose que vous pouvez faire est:

  • Get module Perl Schedule::Cron

  • modifier pour ne dormir que de façon optionnelle (créer un mode "avance rapide" et où il ne dort pas ($ sleep) pour ne rien faire lors de l'avance rapide. Cela nécessitera également de changer $now = time; appel pour faire $now++.

  • Modifiez-la pour pouvoir indiquer les heures de début et de fin de l'émulation.

  • Créer un Perl one-liner qui prend la sortie de crontab -l et il se transforme en Contab similaire, mais qui remplace la commande cmd1 arg1 arg2 avec un sous-programme Perl sub { print "Execution: cmd1 arg1 arg2\n"}

  • Exécutez le programmateur en mode avance rapide, comme indiqué dans le POD.

    Il va lire dans votre crontab modifié, et émuler l'exécution.

+0

NOTE: Roland (l'auteur/mainteneur de Schedule :: Cron) a publié une manière plus élégante d'effectuer une avance rapide en utilisant son module. – DVK

0

Voici une approche similaire à DVK, mais en utilisant le module Perl Schedule::Cron::Events.

Il s'agit d'un article de type «utilisateur caveat» - un point de départ. Compte tenu de ce fichier crontab a_crontab.txt:

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

Le cron.pl ci-dessous script, exécutez comme suit, donne:

$ 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" 

scénario Prototype (!):

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); 
} 

espère que vous pouvez adapter à vos besoins.

1

Il existe une solution fine et propre pour un 'mode de simulation' de Schedule :: Cron (et pour tout autre module utilisant sleep, time, alarm en interne sans modifier Schedule :: Cron lui-même. pour throtteling, par exemple avec

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

on peut accélérer votre « machine à temps » par un facteur 600 (donc, au lieu de dormir pendant 10 minutes, il ne dormir une seconde). S'il vous plaît se référer à la page de manuel du temps :: Mock pour plus de détails.

Pour utiliser un fichier crontab directement à l'annexe :: Cron, vous devriez être en mesure de prendre l'exemple de la README directement:

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

L'astuce est d'utiliser une méthode de distributeur par défaut qui appelle system() avec les paramètres enregistrés. S'il vous plaît laissez-moi savoir, si cela fonctionnera pour vous ou si elle devra être réparée. Au lieu de système, vous pouvez également utiliser imprimer, bien sûr.