Hi List
I am trying to write a code which will work as self monitoring script. The
parent will work for something and child will check that parent program is
running or not . If parent is not running or somehow killed or crashed then
child will restart the parent . But I am not getting the desired output.
Please rectify my mistake.
use strict;
use warnings;
use File::Basename;
use Cwd qw(realpath);
my $home;
$home = dirname(realpath ($0));
my ($scriptname) = File::Basename::fileparse($0);
my $scriptname_absolute_path = "$home/$scriptname";
my $pid = $$;
my $count = 0;
my $child_pid = fork;
if ( $child_pid ) {
print "INSIDE PARENT \n";
#### In the parent #####
#### do some job here #####
} elsif ( $child_pid == 0 ) {
## In the Child ####
do_work();
} elsif ( not defined $child_pid ) {
warn "could not fork, waiting two seconds to try again";
$count += 1;
if ($count == 5) {
print "could not fork,resourse busy exititg the program \n";
exit 0;
}
sleep 2;
next;
}
sub do_work {
while (1) {
my $output = `ps -ef | grep $pid | grep -v grep`;
if ( $output ) {
sleep 10;
next;
} else {
my $fname = "$scriptname_absolute_path.log";
print "child $$ working on $fname \n";
my $datestring;
if ( ! -s $fname) {
$datestring = time_check();
open my $WFH,'>',$fname or die "Can't open $fname $! \n";
print $WFH "$scriptname_absolute_path terminates at $datestring,
going to start it.\n";
`perl $scriptname_absolute_path`;
exit 0;
} else {
$datestring = time_check();
open my $WFH1,'>>',$fname or die "Can't open $fname $! \n";
print $WFH1 "$scriptname_absolute_path terminates at $datestring,
going to start it.\n";
`perl $scriptname_absolute_path`;
exit 0;
}
}
}
}
sub time_check {
@_ = localtime(time);
return(sprintf("%02d:%02d %02d/%02d/%04d", @_[2,1], $_[4]+1, $_[3],
$_[5]+1900));
}