Hi List

Program Scenario:
Trying to implement a small( may be fake) level application level cluster
implementation.

Directory Structure:
$home/cluster/box1
$home/cluster/box1
$home/cluster/shared_location

>From the box1 and box2:

There are presently two sets program in box1 and box2 1)daemon.pl and
2)clusterservice.pl [ both are same set in box1 and box2 ].
When 1 set of program is running( i.e. from $home/cluster/box1 daemon.pl and
clusterservice.pl they are active ) the other set ( from $home/cluster/box2
daemon.pl  is in passive mode i.e. not running and clusterservice.pl is
running).

daemon.pl is running under a while 1 loop.
clusterserservice.pl is checking that daemon.pl is running or not. If not
running the starts the daemon.pl.Now in a cluster scenario when 1 set of
program stops/killed/not running then the other sets start to run.

So how to implement this scenario.

I have written some code but which is not able to handle the whole scenario.

#############################  daemon.pl
##############################################################################################
use strict;
use warnings;

use File::Basename;
use Cwd qw(realpath);

my ( $scriptname, $home );
($scriptname, $home ) = File::Basename::fileparse( realpath( $0 ) );
my $sharedloc_info =
"/home/merge/testcode/cluster/sharedbox/daemon_status.txt";
my $progname_abs_path = "$home$scriptname";
my $sharedloc_status =
"/home/merge/testcode/cluster/sharedbox/daemon_execution_status.txt";
my $pid = $$;

 my $tm = time_check();
open my $WFH,'>',$sharedloc_info or die "Can't open $sharedloc_info $! \n";
flock($WFH,2);
print $WFH "[$tm] $progname_abs_path $scriptname $pid\n";
close($WFH);


$SIG{INT} = $SIG{TERM} = $SIG{HUP} = $SIG{__DIE__} = sub {
    open my $WFH_status,'>>',$sharedloc_status or die "Can't open
$sharedloc_status $! \n";
    flock($WFH_status,2);
    print $WFH_status "$progname_abs_path\n";
    exit 0;
};





while (1) {
    #print "Hello I am alive >> /dev/null";
    sleep 20;
}





sub time_check {
        @_ = localtime(time);
        return(sprintf("%02d:%02d:%02d%-02d/%02d/%04d", @_[2,1,0],  $_[3],
$_[4]+1, $_[5]+1900));
}

####################################################################################################################################

############################# clusterservice.pl
#########################################################################################

use strict;
use warnings;

use File::Basename;
use Cwd qw(realpath);

my ( $scriptname, $home );
($scriptname, $home ) = File::Basename::fileparse( realpath( $0 ) );

my $continue = 1;
my $sharedloc_info =
"/home/merge/testcode/cluster/sharedbox/daemon_status.txt";
my $daemon_exe = "/home/merge/testcode/cluster/box1/a_tdaemon.pl";

$SIG{TERM} = sub { $continue = 1 };

open my $DATA,'<',$sharedloc_info or die "Cant'open $sharedloc_info $! \n";
flock($DATA,2);
my @watch = [map {split} <$DATA>];
close($DATA);

while ($continue) {

   for my $watch (@watch) {
       my $status = kill(0,$watch->[3]);
       if ( ! $status ) {
           sleep 15;
           $status = kill(0,$watch->[3]);
           if    ( ! $status  )    {
                my $file_name = $watch->[2];
                my $proc_status = `ps -ef | grep perl | grep $file_name |
grep -v grep >> /dev/null`;
                if ( $proc_status ) {
                    my $dir_name = dirname($watch->[1]);
                    print "$watch->[2] is not running from  $dir_name\n";
                } else  {
                    my $proc_status = `ps -ef | grep perl | grep $file_name
| grep -v grep >> /dev/null`;
                    if (! $proc_status) {
                                    my $exe_cmd = "perl $daemon_exe";
                                    system($exe_cmd);
                                    print "$scriptname was stopped It has
been started by ","$home \n" ;
                    }
                }
           }
       }
       #check $watch->[0] is a alive
       #if not start $watch->[1] and put its pid in $watch->[0]
   }
   sleep 1;
}

#############################################################################################################################################


With regards
Anirban Adhikary.

Reply via email to