version 1.51, 2002/08/06 13:48:47
|
version 1.55, 2003/02/03 13:43:38
|
Line 41 Note that a lonsql.pid file contains the
|
Line 41 Note that a lonsql.pid file contains the
|
|
|
=head1 DESCRIPTION |
=head1 DESCRIPTION |
|
|
lonsql is many things to many people. To me, it is a source file in need |
lonsql is |
of documentation. |
|
|
|
=head1 Internals |
=head1 Internals |
|
|
Line 116 my $MAX_CLIENTS_PER_CHILD = 5; # numb
|
Line 115 my $MAX_CLIENTS_PER_CHILD = 5; # numb
|
my %children = (); # keys are current child process IDs |
my %children = (); # keys are current child process IDs |
my $children = 0; # current number of children |
my $children = 0; # current number of children |
|
|
######################################################## |
|
######################################################## |
|
|
|
=pod |
|
|
|
=item Functions required for forking |
|
|
|
=over 4 |
|
|
|
=item REAPER |
|
|
|
REAPER takes care of dead children. |
|
|
|
=item HUNTSMAN |
|
|
|
Signal handler for SIGINT. |
|
|
|
=item HUPSMAN |
|
|
|
Signal handler for SIGHUP |
|
|
|
=item DISCONNECT |
|
|
|
Disconnects from database. |
|
|
|
=back |
|
|
|
=cut |
|
|
|
######################################################## |
|
######################################################## |
|
sub REAPER { # takes care of dead children |
|
$SIG{CHLD} = \&REAPER; |
|
my $pid = wait; |
|
$children --; |
|
&logthis("Child $pid died"); |
|
delete $children{$pid}; |
|
} |
|
|
|
sub HUNTSMAN { # signal handler for SIGINT |
|
local($SIG{CHLD}) = 'IGNORE'; # we're going to kill our children |
|
kill 'INT' => keys %children; |
|
my $execdir=$perlvar{'lonDaemons'}; |
|
unlink("$execdir/logs/lonsql.pid"); |
|
&logthis("<font color=red>CRITICAL: Shutting down</font>"); |
|
$unixsock = "mysqlsock"; |
|
my $port="$perlvar{'lonSockDir'}/$unixsock"; |
|
unlink($port); |
|
exit; # clean up with dignity |
|
} |
|
|
|
sub HUPSMAN { # signal handler for SIGHUP |
|
local($SIG{CHLD}) = 'IGNORE'; # we're going to kill our children |
|
kill 'INT' => keys %children; |
|
close($server); # free up socket |
|
&logthis("<font color=red>CRITICAL: Restarting</font>"); |
|
my $execdir=$perlvar{'lonDaemons'}; |
|
$unixsock = "mysqlsock"; |
|
my $port="$perlvar{'lonSockDir'}/$unixsock"; |
|
unlink($port); |
|
exec("$execdir/lonsql"); # here we go again |
|
} |
|
|
|
sub DISCONNECT { |
|
$dbh->disconnect or |
|
&logthis("<font color=blue>WARNING: Couldn't disconnect from database ". |
|
" $DBI::errstr : $@</font>"); |
|
exit; |
|
} |
|
|
|
################################################################### |
################################################################### |
################################################################### |
################################################################### |
|
|
Line 222 my $run =0; # running count
|
Line 151 my $run =0; # running count
|
# |
# |
# Read loncapa_apache.conf and loncapa.conf |
# Read loncapa_apache.conf and loncapa.conf |
# |
# |
my $perlvarref=LONCAPA::Configuration::read_conf('loncapa_apache.conf', |
my $perlvarref=LONCAPA::Configuration::read_conf('loncapa.conf'); |
'loncapa.conf'); |
|
my %perlvar=%{$perlvarref}; |
my %perlvar=%{$perlvarref}; |
# |
# |
# Make sure that database can be accessed |
# Make sure that database can be accessed |
Line 241 unless ($dbh = DBI->connect("DBI:mysql:l
|
Line 169 unless ($dbh = DBI->connect("DBI:mysql:l
|
} else { |
} else { |
$dbh->disconnect; |
$dbh->disconnect; |
} |
} |
|
|
# |
# |
# Check if other instance running |
# Check if other instance running |
# |
# |
Line 251 if (-e $pidfile) {
|
Line 180 if (-e $pidfile) {
|
chomp($pide); |
chomp($pide); |
if (kill 0 => $pide) { die "already running"; } |
if (kill 0 => $pide) { die "already running"; } |
} |
} |
|
|
# |
# |
# Read hosts file |
# Read hosts file |
# |
# |
Line 268 while (my $configline=<CONFIG>) {
|
Line 198 while (my $configline=<CONFIG>) {
|
close(CONFIG); |
close(CONFIG); |
# |
# |
$PREFORK=int($PREFORK/4); |
$PREFORK=int($PREFORK/4); |
|
|
# |
# |
# Create a socket to talk to lond |
# Create a socket to talk to lond |
# |
# |
Line 280 unless ($server=IO::Socket::UNIX->new(Lo
|
Line 211 unless ($server=IO::Socket::UNIX->new(Lo
|
Listen => 10)) { |
Listen => 10)) { |
print "in socket error:$@\n"; |
print "in socket error:$@\n"; |
} |
} |
######################################################## |
|
######################################################## |
|
# |
# |
# Fork once and dissociate |
# Fork once and dissociate |
|
# |
my $fpid=fork; |
my $fpid=fork; |
exit if $fpid; |
exit if $fpid; |
die "Couldn't fork: $!" unless defined ($fpid); |
die "Couldn't fork: $!" unless defined ($fpid); |
POSIX::setsid() or die "Can't start new session: $!"; |
POSIX::setsid() or die "Can't start new session: $!"; |
|
|
# |
# |
# Write our PID on disk |
# Write our PID on disk |
my $execdir=$perlvar{'lonDaemons'}; |
my $execdir=$perlvar{'lonDaemons'}; |
Line 295 open (PIDSAVE,">$execdir/logs/lonsql.pid
|
Line 227 open (PIDSAVE,">$execdir/logs/lonsql.pid
|
print PIDSAVE "$$\n"; |
print PIDSAVE "$$\n"; |
close(PIDSAVE); |
close(PIDSAVE); |
&logthis("<font color=red>CRITICAL: ---------- Starting ----------</font>"); |
&logthis("<font color=red>CRITICAL: ---------- Starting ----------</font>"); |
|
|
# |
# |
# Ignore signals generated during initial startup |
# Ignore signals generated during initial startup |
$SIG{HUP}=$SIG{USR1}='IGNORE'; |
$SIG{HUP}=$SIG{USR1}='IGNORE'; |
Line 303 $SIG{HUP}=$SIG{USR1}='IGNORE';
|
Line 236 $SIG{HUP}=$SIG{USR1}='IGNORE';
|
for (1 .. $PREFORK) { |
for (1 .. $PREFORK) { |
make_new_child(); |
make_new_child(); |
} |
} |
|
|
# |
# |
# Install signal handlers. |
# Install signal handlers. |
$SIG{CHLD} = \&REAPER; |
$SIG{CHLD} = \&REAPER; |
$SIG{INT} = $SIG{TERM} = \&HUNTSMAN; |
$SIG{INT} = $SIG{TERM} = \&HUNTSMAN; |
$SIG{HUP} = \&HUPSMAN; |
$SIG{HUP} = \&HUPSMAN; |
|
|
# |
# |
# And maintain the population. |
# And maintain the population. |
while (1) { |
while (1) { |
Line 586 Writes $message to the logfile.
|
Line 521 Writes $message to the logfile.
|
sub logthis { |
sub logthis { |
my $message=shift; |
my $message=shift; |
my $execdir=$perlvar{'lonDaemons'}; |
my $execdir=$perlvar{'lonDaemons'}; |
my $fh=IO::File->new(">>$execdir/logs/lonsqlfinal.log"); |
my $fh=IO::File->new(">>$execdir/logs/lonsql.log"); |
my $now=time; |
my $now=time; |
my $local=localtime($now); |
my $local=localtime($now); |
print $fh "$local ($$): $message\n"; |
print $fh "$local ($$): $message\n"; |
Line 874 sub userlog {
|
Line 809 sub userlog {
|
return join('&',sort(@results)); |
return join('&',sort(@results)); |
} |
} |
|
|
|
######################################################## |
|
######################################################## |
|
|
|
=pod |
|
|
|
=item Functions required for forking |
|
|
|
=over 4 |
|
|
|
=item REAPER |
|
|
|
REAPER takes care of dead children. |
|
|
|
=item HUNTSMAN |
|
|
|
Signal handler for SIGINT. |
|
|
|
=item HUPSMAN |
|
|
|
Signal handler for SIGHUP |
|
|
|
=item DISCONNECT |
|
|
|
Disconnects from database. |
|
|
|
=back |
|
|
|
=cut |
|
|
|
######################################################## |
|
######################################################## |
|
sub REAPER { # takes care of dead children |
|
$SIG{CHLD} = \&REAPER; |
|
my $pid = wait; |
|
$children --; |
|
&logthis("Child $pid died"); |
|
delete $children{$pid}; |
|
} |
|
|
|
sub HUNTSMAN { # signal handler for SIGINT |
|
local($SIG{CHLD}) = 'IGNORE'; # we're going to kill our children |
|
kill 'INT' => keys %children; |
|
my $execdir=$perlvar{'lonDaemons'}; |
|
unlink("$execdir/logs/lonsql.pid"); |
|
&logthis("<font color=red>CRITICAL: Shutting down</font>"); |
|
$unixsock = "mysqlsock"; |
|
my $port="$perlvar{'lonSockDir'}/$unixsock"; |
|
unlink($port); |
|
exit; # clean up with dignity |
|
} |
|
|
|
sub HUPSMAN { # signal handler for SIGHUP |
|
local($SIG{CHLD}) = 'IGNORE'; # we're going to kill our children |
|
kill 'INT' => keys %children; |
|
close($server); # free up socket |
|
&logthis("<font color=red>CRITICAL: Restarting</font>"); |
|
my $execdir=$perlvar{'lonDaemons'}; |
|
$unixsock = "mysqlsock"; |
|
my $port="$perlvar{'lonSockDir'}/$unixsock"; |
|
unlink($port); |
|
exec("$execdir/lonsql"); # here we go again |
|
} |
|
|
|
sub DISCONNECT { |
|
$dbh->disconnect or |
|
&logthis("<font color=blue>WARNING: Couldn't disconnect from database ". |
|
" $DBI::errstr : $@</font>"); |
|
exit; |
|
} |
|
|
|
|
|
|
|
|