【问题标题】:crontab report of what runs in a specified start and end datetimecrontab 报告在指定的开始和结束日期时间运行的内容
【发布时间】:2009-11-10 16:28:30
【问题描述】:

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

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

我正计划编写自己的脚本,但想知道那里是否已经有什么东西了

【问题讨论】:

    标签: unix crontab


    【解决方案1】:

    你可以做的一件事是:

    • 获取 Perl 模块Schedule::Cron

    • 将其修改为仅可选地休眠(创建“快进”模式,并且在快进时它会在哪里 sleep($sleep) 更改为不执行任何操作。这还需要将 $now = time; 调用更改为执行 @ 987654323@.

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

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

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

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

    【讨论】:

    • 注意:Roland(Schedule::Cron 的作者/维护者)使用他的模块发布了一种更优雅的快进方式。
    【解决方案2】:

    对于 Schedule::Cron 的“模拟模式”(以及任何其他在内部使用睡眠、时间、警报而不修改 Schedule::Cron 本身的模块),有一个很好且干净的解决方案。您可以将 Time::Mock 用于节流,例如使用

    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()。请让我知道,这是否适合您或是否需要修复。当然,您也可以使用 print 来代替 system。

    【讨论】:

      【解决方案3】:

      这是与 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 );
      }
      

      希望你能适应你的需要。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-06
        • 2021-07-19
        • 2019-12-10
        相关资源
        最近更新 更多