-#!/usr/bin/perl
+#!/usr/bin/perl -w
#
# This is the DX cluster 'daemon'. It sits in the middle of its little
# web of client routines sucking and blowing data where it may.
# make sure that modules are searched in the order local then perl
BEGIN {
+ umask 002;
+
# root of directory tree for this system
$root = "/spider";
$root = $ENV{'DXSPIDER_ROOT'} if $ENV{'DXSPIDER_ROOT'};
unshift @INC, "$root/perl"; # this IS the right way round!
unshift @INC, "$root/local";
+
+ # try to create and lock a lockfile (this isn't atomic but
+ # should do for now
+ $lockfn = "$root/perl/cluster.lock"; # lock file name
+ if (-e $lockfn) {
+ open(CLLOCK, "$lockfn") or die "Can't open Lockfile ($lockfn) $!";
+ my $pid = <CLLOCK>;
+ chomp $pid;
+ die "Lockfile ($lockfn) and process $pid exist, another cluster running?" if kill 0, $pid;
+ close CLLOCK;
+ }
+ open(CLLOCK, ">$lockfn") or die "Can't open Lockfile ($lockfn) $!";
+ print CLLOCK "$$\n";
+ close CLLOCK;
}
use Msg;
use Bands;
use Geomag;
use CmdAlias;
+use Filter;
use Local;
+use Fcntl ':flock';
use Carp;
@inqueue = (); # the main input queue, an array of hashes
$systime = 0; # the time now (in seconds)
-$version = "1.22"; # the version no of the software
+$version = "1.26"; # the version no of the software
$starttime = 0; # the starting time of the cluster
-
+$lockfn = "cluster.lock"; # lock file name
+
# handle disconnections
sub disconnect
{
sub cease
{
my $dxchan;
+
+ $SIG{'TERM'} = 'IGNORE';
+ $SIG{'INT'} = 'IGNORE';
eval {
Local::finish(); # end local processing
foreach $dxchan (DXChannel->get_all()) {
disconnect($dxchan) unless $dxchan == $DXProt::me;
}
+ Msg->event_loop(1, 0.05);
+ Msg->event_loop(1, 0.05);
+ Msg->event_loop(1, 0.05);
+ Msg->event_loop(1, 0.05);
+ DXUser::finish();
Log('cluster', "DXSpider V$version stopped");
+ unlink $lockfn;
exit(0);
}
# initialise User file system
print "loading user file system ...\n";
-DXUser->init($userfn);
+DXUser->init($userfn, 1);
# start listening for incoming messages/connects
print "starting listener ...\n";
};
dbg('local', "Local::init error $@") if $@;
-
-
# print various flags
#print "useful info - \$^D: $^D \$^W: $^W \$^S: $^S \$^P: $^P\n";
last if --$decease <= 0;
}
}
+cease(0);
+exit(0);