]> git.etc.gen.nz Git - spong.git/commitdiff
Fix up handling of commands that are executable and add lots more debugging.
authorAndrew Ruthven <andrew@etc.gen.nz>
Thu, 27 Dec 2007 09:11:56 +0000 (22:11 +1300)
committerAndrew Ruthven <andrew@etc.gen.nz>
Thu, 27 Dec 2007 09:11:56 +0000 (22:11 +1300)
Back when I was using Spong at a previous job years ago, and again now that
I'm playing with it at home I ran into problems with lots of spong-network
processes all claming to be checking the same server and check.

I finally decided to dig into it.  In the current case it is because the
program wasn't executable and SafeExec wasn't working that out.  The
forked child was continuing to run for whatever reason.

This appears to work correctly now, I don't have ghost spong-network
processes hanging around anymore.

src/lib/Spong/SafeExec.pm

index 86f1e6d13fddc6625d40b54c6b91be8fd170a606..abee8b1f245842edc49c672e47a7e6ff8ee89ad5 100755 (executable)
@@ -16,13 +16,14 @@ sub safe_exec {
 
     $timeout = 15 if  $timeout <= 0;
 
+    main::debug("Going to run $cmd, timeout of $timeout", 10);
     my $pid = open(CMD, "-|");
 
     if ($pid) { # I'm the parent
-
         $message = "";
         eval {
-            local $SIG{'ALRM'} = sub { die };
+            local $SIG{'ALRM'} = sub { die "alarm\n" };
+            local $SIG{'PIPE'} = sub { die "pipe closed\n" };
             alarm($timeout);
 
             @output = <CMD>;
@@ -30,11 +31,17 @@ sub safe_exec {
             alarm(0);
         };
 
+        main::debug("After eval for $cmd", 10);
+        if ($@) {
+            main::debug("Timeout for $cmd triggered: $@", 10);
+        }
+
         close CMD or !$! or croak "Error closing CMD fh: $!";
         alarm(0);
 
         # Handle child process is not gone
         if ( kill 0,$pid ) {
+            main::debug("Child process that was running '$cmd' hasn't finished, terminating", 10);
             kill "INTR",$pid;  # Try control+C
             sleep 1;           # Give it time to die
 
@@ -48,7 +55,23 @@ sub safe_exec {
         }
 
     } else {
-        exec($cmd) || croak "cannot exec program $cmd: $!";
+        $0 = "$0 - (SafeExec)";
+        main::debug("Child process running '$cmd'", 10);
+        system($cmd);
+
+        if ($? == -1) {
+            carp "cannot execute '$cmd': $!";
+            exit -1;
+        } elsif ($? & 127) {
+            carp "'$cmd' failed with signal " . ($? & 127);
+            exit -1;
+        } elsif ($? != 0) {
+            main::log("Command '$cmd' return error code: " . $? >> 8);
+        }
+
+        main::debug("Child process finished '$cmd'", 10);
+
+        exit;
     }
 
    wantarray ? @output : join '', @output;