首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在指定的开始和结束日期时间中运行的内容的crontab报告

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

Stack Overflow用户
提问于 2009-11-10 05:46:06
回答 3查看 1.5K关注 0票数 3

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

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

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

EN

回答 3

Stack Overflow用户

发布于 2009-11-10 06:30:43

您可以做的一件事是:

让Perl模块Schedule::Cron

  • Modify它只睡眠可选的(创建“快进”模式,它在哪里睡眠($sleep)更改为不做任何事情时,快进。这也将需要更改$now++.

  • Modify它的调用,以便能够指示emulation.

  • Create的开始和结束时间,这是一个Perl一行程序,它获取crontab -l的输出并将其转换为类似的contab,但它用一个Perl子例程替换cmd1 arg1 arg2命令,使调度程序处于快进模式,如POD中所示。

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

票数 1
EN

Stack Overflow用户

发布于 2009-11-10 16:28:31

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

代码语言:javascript
运行
复制
perl -MTime::Mock=throttle,600 schedule.pl

一个人可以将你的“时光机”加速600倍(因此,它只会睡眠一秒钟,而不是睡眠10分钟)。有关更多详细信息,请参阅Time::Mock的手册页。

要将crontab文件直接与Schedule::Cron一起使用,您应该能够直接从自述文件中获取示例:

代码语言:javascript
运行
复制
 use Schedule::Cron;
 my $cron = new Schedule::Cron(sub { system(shift) },
                               file => "/var/spool/crontab.perl");
 $cron->run();

这里的技巧是使用默认的dispatcher方法,该方法使用存储的参数调用system()。请让我知道,这是否会为您工作,或它是否需要修复。当然,您也可以使用print而不是system。

票数 1
EN

Stack Overflow用户

发布于 2009-11-10 06:45:37

这里有一种与DVK类似的方法,但使用的是Perl模块Schedule::Cron::Events

这是一个非常“警告用户”的帖子--一个起点。给定此crontab文件a_crontab.txt:

代码语言:javascript
运行
复制
59 21 * * 1-5    ls >> $HOME/work/stack_overflow/cron_ls.txt
    # A comment
18 09 * * 1-5    echo "wibble"

下面的脚本cron.pl,按如下方式运行,提供:

代码语言:javascript
运行
复制
$ 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"

原型(!)脚本:

代码语言:javascript
运行
复制
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 );
}

希望你能适应你的需求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1704084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档