--- loncom/lond 2000/09/25 20:22:58 1.21
+++ loncom/lond 2000/12/05 18:02:14 1.24
@@ -25,9 +25,36 @@ use LWP::UserAgent();
use GDBM_File;
use Authen::Krb4;
+# grabs exception and records it to log before exiting
+sub catchexception {
+ my ($signal)=@_;
+ &logthis("CRITICAL: "
+ ."ABNORMAL EXIT. Child $$ for server $wasserver died through "
+ ."$signal with this parameter->[$@]");
+ die($@);
+}
+
+# grabs exception and records it to log before exiting
+# NOTE: we must NOT use the regular (non-overrided) die function in
+# the code because a handler CANNOT be attached to it
+# (despite what some of the documentation says about SIG{__DIE__}.
+sub catchdie {
+ my ($message)=@_;
+ &logthis("CRITICAL: "
+ ."ABNORMAL EXIT. Child $$ for server $wasserver died through "
+ ."\_\_DIE\_\_ with this parameter->[$message]");
+ die($message);
+}
+
+# -------------------------------- Set signal handlers to record abnormal exits
+
+$SIG{'QUIT'}=\&catchexception;
+$SIG{__DIE__}=\&catchexception;
+
# ------------------------------------ Read httpd access.conf and get variables
-open (CONFIG,"/etc/httpd/conf/access.conf") || die "Can't read access.conf";
+open (CONFIG,"/etc/httpd/conf/access.conf")
+ || catchdie "Can't read access.conf";
while ($configline=) {
if ($configline =~ /PerlSetVar/) {
@@ -46,14 +73,15 @@ if (-e $pidfile) {
my $lfh=IO::File->new("$pidfile");
my $pide=<$lfh>;
chomp($pide);
- if (kill 0 => $pide) { die "already running"; }
+ if (kill 0 => $pide) { catchdie "already running"; }
}
$PREFORK=4; # number of children to maintain, at least four spare
# ------------------------------------------------------------- Read hosts file
-open (CONFIG,"$perlvar{'lonTabDir'}/hosts.tab") || die "Can't read host file";
+open (CONFIG,"$perlvar{'lonTabDir'}/hosts.tab")
+ || catchdie "Can't read host file";
while ($configline=) {
my ($id,$domain,$role,$name,$ip)=split(/:/,$configline);
@@ -70,7 +98,7 @@ $server = IO::Socket::INET->new(LocalPor
Proto => 'tcp',
Reuse => 1,
Listen => 10 )
- or die "making socket: $@\n";
+ or catchdie "making socket: $@\n";
# --------------------------------------------------------- Do global variables
@@ -253,9 +281,9 @@ sub ishome {
$fpid=fork;
exit if $fpid;
-die "Couldn't fork: $!" unless defined ($fpid);
+catchdie "Couldn't fork: $!" unless defined ($fpid);
-POSIX::setsid() or die "Can't start new session: $!";
+POSIX::setsid() or catchdie "Can't start new session: $!";
# ------------------------------------------------------- Write our PID on disk
@@ -294,14 +322,14 @@ sub make_new_child {
# block signal for fork
$sigset = POSIX::SigSet->new(SIGINT);
sigprocmask(SIG_BLOCK, $sigset)
- or die "Can't block SIGINT for fork: $!\n";
+ or catchdie "Can't block SIGINT for fork: $!\n";
- die "fork: $!" unless defined ($pid = fork);
+ catchdie "fork: $!" unless defined ($pid = fork);
if ($pid) {
# Parent records the child's birth and returns.
sigprocmask(SIG_UNBLOCK, $sigset)
- or die "Can't unblock SIGINT for fork: $!\n";
+ or catchdie "Can't unblock SIGINT for fork: $!\n";
$children{$pid} = 1;
$children++;
return;
@@ -311,7 +339,7 @@ sub make_new_child {
# unblock signals
sigprocmask(SIG_UNBLOCK, $sigset)
- or die "Can't unblock SIGINT for fork: $!\n";
+ or catchdie "Can't unblock SIGINT for fork: $!\n";
$tmpsnum=0;
@@ -522,7 +550,7 @@ sub make_new_child {
$response=$ua->request($request,$transname);
}
if ($response->is_error()) {
- unline($transname);
+ unlink($transname);
my $message=$response->status_line;
&logthis(
"LWP GET: $message for $fname ($remoteurl)");