in reply to Re: Win32 capturing output from a process that may hang
in thread Win32 capturing output from a process that may hang

This looks really nice but I can not get it to work :(

C:\system\Perl\bin>perl print.pl one two This is my @ARGV one, two >perl -MWin32::Job -le"$job=Win32::Job->new;$job->spawn('perl', 'perl +print.pl one two', {stdout=> 'test.out'}); print "ran OK" if $job->ru +n(5);" >type test.out >dir test.out Volume in drive C is CDRIVE Volume Serial Number is 144D-4181 Directory of C:\system\Perl\bin 02/03/2005 16:13 0 test.out 1 File(s) 0 bytes 0 Dir(s) 2,907,258,880 bytes free C:\system\Perl\bin>time The current time is: 16:13:31.15 Enter the new time:
It is also not printing "Ran OK" even though it is returning the prompt imediately so not hitting the 5 second timeout. Did I miss something obvious ? (I also tried giving it stdout => 'test.out' which the doco says should also work, same thing, zero byte file)

Cheers,
R.

Pereant, qui ante nos nostra dixerunt!

Replies are listed 'Best First'.
Re^3: Win32 capturing output from a process that may hang
by ZlR (Chaplain) on Mar 02, 2005 at 16:38 UTC
    I will have to check later on a 5.8 install .
    At first i'd say it doesn't print "ran OK" because the run method applies the timeout only if something went wrong which is not the case here . From the docs of run:

    Returns a boolean indicating whether the processes exited by themselves, or whether the time expired.

    later,
    zlr

      Also from the docs for run($timeout, $which);...

      A true return value means the processes exited normally; a false value means one or more processes was killed with $timeout

      so that is not the prob unless the docs have got it base over apex

      Cheers,
      R.

      Pereant, qui ante nos nostra dixerunt!
        Ah, but it works like i think it does !

        Here 's tt.pl :

        use strict ; use warnings; use Win32::Job ; my $job = Win32::Job->new; my $tmout = 20 ; my %opt = ( stdout => 'out.txt' , stderr => 'err.txt' ) ; $job -> spawn ( 'c:/perl/bin/perl.exe', 'perl sp.pl',\%opt) ; my $ok=$job->run($tmout, 0) ; $ok ? print "ended before $tmout sec" : print "had to kill it" ;
        And here the spawned process :
        #!perl use warnings; use strict ; select STDERR ; $|=0 ; select STDOUT ; $|=0 ; my $i = 0 ; while ($i < 5 ) { print STDOUT "Do the hammerlock\n" ; print STDERR "Do the hammerlock you turkeynecks !\n" ; sleep 2; $i++ ; }
        Here is the out.txt file :
        Do the hammerlock Do the hammerlock Do the hammerlock Do the hammerlock Do the hammerlock
        And the err.txt :
        Do the hammerlock you turkeynecks ! Do the hammerlock you turkeynecks ! ... (uh, well, you get it ... )
        With your example it needs print \"ran ok\" and the full path to the perl binary, but test.out is still empty, i can't figure out why ... Something lame with the windows command line, maybe ...

        Anyway Win32::Job does it, as the above example shows, and without much of hassle. It gives you the handler feature if you need it and "job" control and all other windows gimmicks.

        zlr
        well, now let's try to understand this other use threads heavy wizardry stuff :)