#!/usr/bin/perl -w
use strict;
use File::Basename;
use POSIX 'strftime';
use Sys::Syslog;
sub logit($);
logit('starting up');
my $cron_cmd = 'crontab -l';
while ( 1 ) {
my $now = strftime('%H%M', localtime);
my $today = strftime('%w', localtime);
for ( qx/$cron_cmd/ ) {
if ( /^([\d*]+)\s+([\d*]+)\s+([\d*]+)\s+([\d*]+)\s+([\d\-*]+)\s+(.*)/ ) {
my ( $min, $hour, $day, $mon, $dow, $cmd ) = ( $1, $2, $3, $4, $5, $6 );
my $pattern;
if ( $dow =~ m/\-/ ) {
$pattern = "[$dow]";
} elsif ( $dow =~ m/,/ ) {
$dow =~ s/,//;
$pattern = "[$dow]";
} elsif ( $dow =~ m/^\d$/ ) {
$pattern = "^$dow";
} else {
$pattern = ".*";
}
next unless $today =~ qr/$pattern/;
if ( $cmd =~ m#(/etc/init.d/[^\s]+)\s+(start|stop)# ) {
my ( $init, $mode ) = ( $1, $2 );
if ( $mode eq 'start' ) {
$schedule{$init}{start} = "$hour$min";
} else {
$schedule{$init}{stop} = "$hour$min";
}
}
}
}
for ( keys %schedule ) {
if ( $now > $schedule{$_}{start} && $now < $schedule{$_}{stop} ) {
if ( system("$_ status >/dev/null") ) {
if ( $schedule{$_}{status} ne 'FAIL' || !$schedule{$_}{status} ) {
logit("$_ isnt running");
$schedule{$_}{status} = 'FAIL';
}
} else {
if ( defined $schedule{$_}{status} && $schedule{$_}{status} eq 'FAIL' ) {
logit("$_ is back to normal");
}
$schedule{$_}{status} = 'OK';
}
}
}
sleep 5;
}
logit('shutting down');
sub logit($) {
my $msg = shift;
openlog(basename($0), '', 'LOG_DAEMON');
syslog('info', $msg);
closelog();
}
####
00 05 * * 0 /etc/init.d/foo start
00 22 * * 0 /etc/init.d/foo stop
####
00 05 * * 1-5 /etc/init.d/foo2 start
00 22 * * 1-5 /etc/init.d/foo2 stop