Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[tesh] cleanup: don't start useless process instead of killing it right away
[simgrid.git] / tools / tesh / tesh.pl
index 74e6f0c..d67fe47 100755 (executable)
@@ -45,6 +45,7 @@ use Term::ANSIColor;
 use Text::ParseWords;
 use IPC::Open3;
 use IO::File;
+use English;
 
 ## 
 ## Portability bits for windows
@@ -68,6 +69,21 @@ BEGIN {
 ## Command line option handling
 ##
 
+if ($ARGV[0] eq "--internal-killer-process") {
+    # We fork+exec a waiter process in charge of killing the command after timeout
+    # If the command stops earlier, that's fine: the killer sends a signal to an already stopped process, fails, and quits. 
+    #    Nobody cares about the killer issues. 
+    #    The only problem could arise if another process is given the same PID than cmd. We bet it won't happen :)
+    my $time_to_wait = $ARGV[1];
+    my $pid = $ARGV[2];
+    sleep $time_to_wait;
+    kill('TERM', $pid);
+    sleep 1;
+    kill('KILL', $pid);
+    exit $time_to_wait;
+}
+
+
 sub var_subst {
     my ($text, $name, $value) = @_;
     if ($value) {
@@ -274,43 +290,25 @@ sub exec_cmd {
   close CHILD_IN;
 
   # if timeout specified, fork and kill executing child at the end of timeout
-  if (defined($cmd{'timeout'}) or defined($opts{'timeout'})){
+  if (not $cmd{'background'} and (defined($cmd{'timeout'}) or defined($opts{'timeout'}))){
     $time_to_wait= defined($cmd{'timeout'}) ? $cmd{'timeout'} : $opts{'timeout'};
     $forked = fork();
     $timeout=-1;
     die "fork() failed: $!" unless defined $forked;
     if ( $forked == 0 ) { # child
-      sleep $time_to_wait;
-#      if (RUNNING_ON_WINDOWS) {
-#        system("TASKKILL /F /T /PID $cmd{'pid'}"); 
-#          # /F: Forcefully
-#        # /T: Tree kill
-#        # /PID: poor soul
-#      } else {
-         kill('TERM', $cmd{'pid'});
-         sleep 1;
-         kill('KILL', $cmd{'pid'});
-#      }
-      exit $time_to_wait;
+       exec("$PROGRAM_NAME --internal-killer-process $time_to_wait $cmd{'pid'}");
     }
   }
 
-
   # Cleanup the executing child, and kill the timeouter brother on need
   $cmd{'return'} = 0 unless defined($cmd{'return'});
-  if($cmd{'background'} != 1){
+  if ($cmd{'background'} != 1) {
     waitpid ($cmd{'pid'}, 0);
     $cmd{'gotret'} = exit_status($?);
     parse_out(\%cmd);
-  }else{
+  } else {
     # & commands, which will be handled at the end
     push @bg_cmds, \%cmd;
-    # no timeout for background commands
-    if($forked){
-       kill(SIGKILL, $forked);
-       $timeout=0;
-       $forked=0;
-    }
   }
 }
 
@@ -623,7 +621,7 @@ print "hey\n";
     die "[TESH/CRITICAL] parse error: $line\n";
   }
   if($forked){
-   kill(SIGKILL, $forked);
+   kill('KILL', $forked);
    $timeout=0;
   }
 
@@ -639,7 +637,7 @@ if (defined($cmd{'cmd'})) {
 
 
 if($forked){
-   kill(SIGKILL, $forked);
+   kill('KILL', $forked);
    $timeout=0;
 }