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

Hello again melezhik ,

Create and post some example where you will be testing your code so future visitors have a good starting point or ideas on how to implement it on their project(s).

Keep the "force" strong :D.

Seeking for Perl wisdom...on the process of learning...not there...yet!

Replies are listed 'Best First'.
Re^4: Capture::Tiny alternative
by melezhik (Monk) on Mar 24, 2017 at 13:47 UTC

    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 ...

      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...

        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 ...