in reply to Terminating a parallel process opened with "system(..)"

I'm looking for a way to terminate a (parallel) process opened with by system('start','','some text file for example.txt'); preferably without relaying on non-core modules.

There is no way to do that using start.

The start command is a cmd.exe built-in, so system has to start a new copy of cmd.exe first, to run the start command. Then the start command determines the path & name of the executable associated with the filename you supplied and runs it. There is no way for Perl to know the process id of the process that the start command runs.

The only way to achieve your goal would be to emulate what the start command does -- look up the ftype assoc'd to the file type; then look up the path/executable name for that ftype; then invoke that executable directly.

When run as asyncStart-kill test.png, this starts my image editor with the test.png as its argument; waits 10 seconds and then kills it:

#! perl -slw use strict; my $filename = $ARGV[0]; my( $ext ) = $filename =~ m[(\.[^.]+)$]; my( $assoc ) = `assoc $ext` =~ m[=(.+)$]; my( $ftype ) = `ftype $assoc` =~ m[=(.+)$]; $ftype =~ s[^("[^"]+?"|\S+)\K.+$][]; #" print $ftype; my $pid = system 1, $ftype, $filename; print $pid; sleep 10; kill 9, $pid;

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".
In the absence of evidence, opinion is indistinguishable from prejudice.

The start of some sanity?

Replies are listed 'Best First'.
Re^2: Terminating a parallel process opened with "system(..)"
by palkia (Monk) on May 30, 2012 at 18:01 UTC
    Thank you for your replay.
    I tired your code but the process isn't being "killed",
    The exact same thing is happening with and without the "kill" line.
    not when it's a txt in notepad,
    nor a pl file in the terminal,
    nor an exe file converted from a pl file.
    In the last 2, it didn't even open the process in a new window, but rather in the same terminal (weird).

    Your thoughts ?
    Thx

      See how you get on with this version?

      #! perl -slw use strict; my $filename = $ARGV[0]; my( $ext ) = $filename =~ m[(\.[^.]+)$]; my( $assoc ) = `assoc $ext` =~ m[=(.+)$]; my( $ftype ) = `ftype $assoc` =~ m[=(.+)$]; $ftype =~ s[%(\w+)%][ $ENV{ $1 } ]ge; $ftype =~ s[^("[^"]+?"|\S+)\K.+$][]; #" print $ftype, ':', $filename; my $pid = system 1, $ftype, $filename; print $pid; sleep 10; kill 9, $pid;

      Note: This isn't intended to be a complete replacement for the start command, just a starting point for you to adapt to your needs.


      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".
      In the absence of evidence, opinion is indistinguishable from prejudice.

      The start of some sanity?

        Thank you very much, it works gr8.

        One followup question if you don't mind:
        Should I be worried about zombie process resulting from this "kill" ? (I really can't pull off the bite marks look)
        Would substituting the kill 9, $pid; for while(kill 9, $pid){} or while(kill 9, $pid){sleep 1;}
        would prevent zombies / decrease the chance for zombies / none of the above ?
        Other / better techniques ?
        Thx