Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Re^4: Capture::Tiny alternative

by melezhik (Monk)
on Mar 24, 2017 at 13:47 UTC ( [id://1185780]=note: print w/replies, xml ) Need Help??


in reply to Re^3: Capture::Tiny alternative
in thread Capture::Tiny alternative

Yeah, sure. when I get something to show I will put it here.

Meanwhile here is example of how simple script using Perl IPC to read from external program may hangs :


$ cat test.pl

my $cmd = '/usr/sbin/sshuttle -v -D -r  vagrant@127.0.0.1 192.168.0.0/24';

open(OUT, "$cmd 2>&1 |") || die "can't fork: $!";

while (my $l = <OUT>) {
  print $l;
}

When I run test.pl it hangs:

$ perl test.pl
Starting sshuttle proxy.
Listening on ('127.0.0.1', 12300).
c : connecting to server...
vagrant@127.0.0.1's password:
c : connected.
Connected.

...

^C # I have to enter control C to finish my script

When run the same command directly, it does not hang:


$ /usr/sbin/sshuttle -v -D -r  vagrant@127.0.0.1 192.168.0.0/24
Starting sshuttle proxy.
Listening on ('127.0.0.1', 12300).
c : connecting to server...
vagrant@127.0.0.1's password:
c : connected.
Connected.
$ # finishes without interruption ..

Sshutle information could be found here - https://github.com/apenwarr/sshuttle
But I provide it only __as example__. Probably other command will cause the same Perl/IPC behavior. Any ideas why?


And yeah , with Capture::Tiny sshutle does not hang ...

Replies are listed 'Best First'.
Re^5: Capture::Tiny alternative
by thanos1983 (Parson) on Mar 24, 2017 at 15:07 UTC

    Hello again melezhik ,

    Try your command like this:

    my $cmd = `/usr/sbin/sshuttle -v -D -r vagrant@127.0.0.1 192.168.0.0/ +24`;

    Instead of this:

    my $cmd = '/usr/sbin/sshuttle -v -D -r vagrant@127.0.0.1 192.168.0.0/ +24';

    Read more about it here (How to run a shell script from a Perl program?).

    Seeking for Perl wisdom...on the process of learning...not there...yet!
      my $cmd = `/usr/sbin/sshuttle ...` Instead of this: my $cmd = '/usr/sbin/sshuttle ...'

      I don't think that'll help, as the OP said they want to stream the output of the command, while backticks wait until the external command has completed.

      I suspect there's something going on in the IPC interaction between sshuttle and perl calling it (maybe sshuttle isn't daemonizing properly when called from Perl or something), at the moment I don't know more.

      melezhik: Just a guess, try my $cmd = 'nohup /usr/sbin/sshuttle ...' although that may prevent you from capturing its output, not sure if that's what you want or not. But since you're asking sshuttle to damonize (-D) anyways...

        I don't think that'll help, as the OP said they want to stream the output of the command, while backticks wait until the external command has completed.
        Sure
        Just a guess, try my $cmd = 'nohup /usr/sbin/sshuttle ...' although that may prevent you from capturing its output, not sure if that's what you want or not.
        Unfortunately in real program $cmd comes as users input parameter which I can't alter or modify
        I suspect there's something going on in the IPC interaction between sshuttle and perl calling it
        Yeah, this what I tried to say at the very beginning. There are some rare cases ( rare external commands to interact with ) where Perl/IPC/open ( $cmd |) "hangs" ...
      Anyway, Capture::Tiny::Extended looks like good for me, so I will try ... and let know ...
      yeah, but this way does not work if I want real time STDOUT/STDEER reading ...

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others wandering the Monastery: (7)
As of 2024-04-23 07:45 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found