Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re: Re^4: Use of IPC::Run rather than system()

by IlyaM (Parson)
on Jul 16, 2003 at 19:18 UTC ( #274990=note: print w/ replies, xml ) Need Help??


in reply to Re^4: Use of IPC::Run rather than system()
in thread Use of IPC::Run rather than system()

Something like this should work:

use IPC::Run qw(run); my ($out, $err) = ('', ''); run(['/path/to/prog', @args], '>', sub { $out .= $_[0]; print $_[0] }, '2>', sub { $err .= $_[0]; print $_[0] });

--
Ilya Martynov, ilya@iponweb.net
CTO IPonWEB (UK) Ltd
Quality Perl Programming and Unix Support UK managed @ offshore prices - http://www.iponweb.net
Personal website - http://martynov.org


Comment on Re: Re^4: Use of IPC::Run rather than system()
Download Code
Re: Re: Re^4: Use of IPC::Run rather than system()
by gmarler (Acolyte) on Jul 17, 2003 at 02:04 UTC

    This seems to have worked the best of all, after I turned off buffering for STDOUT/STDERR, with code such as this:

    my ($ofh) = select(STDOUT); $| = 1; select($ofh); $ofh = select(STDERR); $| = 1; select($ofh); my ($out, $err); run ( [ '/usr/sbin/pkgrm', 'VRTSvxvm' ], '>', sub { $out .= $_[0]; print $_[0] }, '2>', sub { $err .= $_[0]; print $_[0] }, );

    Now, if the program I was running demands that it connects to a pty before it will unbuffer STDOUT/STDERR properly, what could I do? I've tried the following, but it doesn't send any output to the screen:

    use IPC::Run qw(run); my ($out, $err); run ( [ '/usr/sbin/pkgrm', 'VRTSvxvm' ], '>', sub { $out .= $_[0]; print $_[0] }, '>', '>pty>', '2>', sub { $err .= $_[0]; print $_[0] }, '2>', '>pty>' );

      I'm not sure it is correct syntax. From IPC::Run docs:

      '>pty>' means '&>pty>', not '1>pty>' The pseudo terminal redirects both stdout and stderr unless you specify a file descriptor. If you want to grab stderr separately, do this: start \@cmd, '<pty<', \$in, '>pty>', \$out, '2>', \$err +;

      So probably your code should look like (untested):

      use IPC::Run qw(run); my ($out, $err); run ( [ '/usr/sbin/pkgrm', 'VRTSvxvm' ], '>pty>', sub { $out .= $_[0]; print STDOUT $_[0] }, '2>', sub { $err .= $_[0]; print STDERR $_[0] }, );

      --
      Ilya Martynov, ilya@iponweb.net
      CTO IPonWEB (UK) Ltd
      Quality Perl Programming and Unix Support UK managed @ offshore prices - http://www.iponweb.net
      Personal website - http://martynov.org

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://274990]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (4)
As of 2014-12-28 19:10 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?





    Results (182 votes), past polls