in reply to Re: Multiple system commands in parallel
in thread Multiple system commands in parallel


Tanktalus....Thank you...this has gotten me one step closer.

Unfortunately, I noticed a small issue. In the event there are 15 files in the directory that need to be process and the script has currently launched, say 8. If the user <ctrl><c> out of the script prior to the script exiting on its own, the 8 that the script initially launch are killed when the user <ctrl><c> out of the script.

Any ideas on how to rectify this?
  • Comment on Re^2: Multiple system commands in parallel

Replies are listed 'Best First'.
Re^3: Multiple system commands in parallel
by Tanktalus (Canon) on May 09, 2016 at 21:22 UTC

    I'm not 100% sure about what's required on Windows. What may work is to set $SIG{INT} to "IGNORE" before spawning the children. Note that when you do so, your process won't be killed by ctrl-C, either - you'll just keep going.

    Another option may be to fork/exec yourself instead of using system, and in the "child" process, do the above - that way the parent process will still be killable partway through while the children will continue to live on their own, e.g.:

    for ($x=0; $x < scalar(@files); $x++ ) { $file=@files[$x]; chomp $file; $cmd="clone -F $file "; print "Launching Command is: $cmd\n"; my $pid = fork; if ($pid) { # parent } elsif (defined $pid) { $SIG{INT} = 'IGNORE'; exec($cmd); } else { die "fork failed."; } }
    This variation you can still hit Ctrl-C to kill the parent, but the children will inherit the ignore status on the signal handler and keep going. (This can also be done in the on_prepare callback in AnyEvent::Util::run_cmd.)

    Finally, if you have control over the clone command, you can have that program ignore the INT signal.

Re^3: Multiple system commands in parallel
by Marshall (Canon) on May 10, 2016 at 00:29 UTC
    I ran "help start" on Win XP. I presume that there are more options on other Window's O/S's. The "/B" option appears to do what you want? (ignore CTL-C?)
      The "/B" option appears to do what you want? (ignore CTL-C?)

      No. It doesn't:

      C:\test>perl -e" system 'start /b c:/perl64/bin/perl.exe -E\"$^|=1; sa +y ++$i while sleep 1\"'; sleep 1000" 1 2 3 4 5 Terminating on signal SIGINT(2) Terminating on signal SIGINT(2)

      That's both processes aborting.

      Contrast:

      C:\test>perl -e" system 'start /min c:/perl64/bin/perl.exe -E\"$^|=1; +say ++$i while sleep 1\"'; sleep 1000" Terminating on signal SIGINT(2)

      The initial process terminates, the second process continues to run, outputting to its own window.


      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority". I knew I was on the right track :)
      In the absence of evidence, opinion is indistinguishable from prejudice.