Поскольку это кажется невозможным без разбора cron, я решил написать сам в perl:
(не уверен, почему форматирование fubar)
#!/usr/bin/perl -w
use strict;
use Set::CrossProduct;</p>
<p>my $begin;
my $end;</p>
<p>if($ARGV[0] && $ARGV[0] =~ /before/i){
$begin = 0;
$end = $ARGV[1];<br>
}
elsif($ARGV[0] && $ARGV[0] =~ /after/i){
$end = 2400;
$begin = $ARGV[1];
}
else{
$begin = $ARGV[0];
$end = $ARGV[1];
}</p>
<p>if(!defined($begin) || !defined($end)){
print STDERR "Invalid Arguments\n";
exit 1;
}</p>
<p>my @crontab = `crontab -l`;</p>
<p>foreach my $cronjob (@crontab){
chomp $cronjob;</p>
<pre><code>next if $cronjob =~ /^ *\#/ ||$cronjob =~ /^ *$/ ;
#print "in: $cronjob\n";
my ($min,$hour,$day_of_month,$month,$day_of_week, @cmd) = split(/ /, $cronjob);
my @mins = expandRange($min,0,59);
my @hours = expandRange($hour,0,23);
my $cp = Set::CrossProduct->new([\@hours,\@mins]);
my $combos = $cp->combinations();
foreach my $time ( map { $_->[0]*100 + $_->[1] } @$combos){
if($time >= $begin && $time <= $end){
print $cronjob,"\n";
last; #don't print the job n times, just once
}
}
}
sub expandRange {
my ($in,$begin,$end) = @_;
#print "in: ($in)[$begin:$end]\n";
my @range;
my @vals = split(/,/,$in);
foreach my $val (@vals){
my $mult = 1;
if($val =~ /\/(.+)$/){
$mult = $1;
$val =~ s/\/(.+)//;
}
if($in =~ /\*/){
@range = grep { $_ % $mult == 0 && $_ >= $begin && $_ <= $end } $begin..$end;
}
elsif($val =~ /[\-:]/){
my ($first, $last) = split(/[\-:]/,$val);
push(@range, grep { $_ % $mult == 0 && $_ >= $begin && $_ <= $end } $first..$last);
}
elsif($val >= $begin && $val <= $end) {
push(@range, $val);
}
}
my %unique;
@unique{@range} = 1;
return sort keys %unique;
}