crontab报告在指定的开始和结束日期时间运行的内容

时间:2009-11-09 21:46:06

标签: unix crontab

是否有任何工具或报告,如果crontab文件可以输出哪些作业在指定的时间范围内运行。

我们的crontab文件变得非常庞大,当我们在服务器上安排停机时,我们的系统管理员很难找出需要重新运行的作业。我们正试图弄清楚我们需要经营哪些工作。

我打算编写自己的脚本,但想知道是否已有某些东西

3 个答案:

答案 0 :(得分:1)

你可以做的一件事是:

  • 获取Perl模块Schedule::Cron

  • 将其修改为仅可选择进入休眠状态(创建“快进”模式和睡眠状态($ sleep)更改为快进时不执行任何操作。这还需要将$now = time;调用更改为做$now++

  • 修改它以指示仿真的开始和结束时间。

  • 创建一个Perl one-liner,它接受crontab -l的输出并将其转换为类似的contab,但用perl子例程cmd1 arg1 arg2替换命令sub { print "Execution: cmd1 arg1 arg2\n"}

  • 以快进模式运行调度程序,如POD中所示。

    它将读入您修改过的crontab,并模拟执行。

答案 1 :(得分:1)

对于Schedule :: Cron的'模拟模式'有一个很好的清洁解决方案(对于任何其他模块使用睡眠,时间,内部警报而不修改Schedule :: Cron本身。你可以使用Time :: Mock for throtteling,例如

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

可以将你的'时间机器'加速600倍(所以,不是睡觉10分钟,它只会睡一秒钟)。有关更多详细信息,请参阅Time :: Mock的联机帮助页。

如果直接在Schedule :: Cron中使用crontab文件,您应该可以直接从 README 中获取示例:

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

这里的技巧是使用默认的调度程序方法,该方法使用存储的参数调用 system()。请告诉我,这是否适用于您或是否需要修复。当然,您也可以使用打印而不是系统。

答案 2 :(得分:0)

这是类似于DVK的方法,但使用Perl模块Schedule::Cron::Events

这是一个非常“警告用户”的帖子 - 一个起点。鉴于此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 );
}

希望你能适应你的需要。