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

As evidenced by the sshuttle ... | cat test, the problem is indeed unrelated to perl. The sshuttle is a python program. Why have you chosen to raise the github issue with Capture-Tiny instead of sshuttle?

I've already hinted on three possible workarounds you could use on the perl size, that may or may not work at all. (Ignore SIGTTIN SIGTTOU before exec; Explicit redirect/close(STDERR); Setting up the task as session leader via IO::Pty.) Did you try any of these?

It is unlikely anyone on PerlMonks is going to debug python programs for your benefit or amusement. And we cannot Chuck Norris(*) your code.

Replies are listed 'Best First'.
Re^7: Capture::Tiny alternative
by melezhik (Monk) on Mar 26, 2017 at 16:39 UTC
    Why do you make emphasis here on what language the programm is written ? As I told it is just an external program a Perl script interact with by IPC. As for me it is still to be proven that sshuttle is culprit. Well, there are some _signs_ that that it could be for sshuttle, but as I told you I am still not sure. And this why I chose adverb _probably_ in my statements.

    I don't blame anybody I just look for help. ))) as for your workarounds , some of them I already tried, and probably will try others ... I just need some time to check, will let you know later

      Simply try the same invocation sshuttle -D ... 2>&- | cat (with the redirect) and see how it behaves.

      However, there seems to be a fundamental misconception about the workings of process environment. A shell command line does not contain or isolate the task. This is how a daemon can work in the first place: it detaches from shell and terminal and starts running on its own. You have indicated that the exit status of the command is of interest to you. But this may be largely irrelevant to the working of your service. The daemon will have forked at least once; the process writing to your pipe/stdout is the child not the $pid you forked.

        Hi! Thanks for explanation. Not sure If I understood all you told here. But what I already tried and here the results:

        sshuttle -D ... 2>&- - hangs, when gets run by Perl script:

        $ cat test.bash
        /usr/sbin/sshuttle -v -D -r vagrant@127.0.0.1 192.168.0.0/24 2>&-
        echo OK
        
        $ cat capture-tiny.pl
        
        use Capture::Tiny qw{tee};
        tee {
          system('bash test.bash');
        };
        
        vagrant@Debian-jessie-amd64-netboot:~/my/IPC-sshutle-issue$ perl capture-tiny.pl
        vagrant@127.0.0.1's password:
        Connected.
        OK
        # hangs here
        
        

        The same result (hangs) with sshutle -D ... 2>&- | cat

        $ cat test.bash
        /usr/sbin/sshuttle -v -D -r vagrant@127.0.0.1 192.168.0.0/24 2>&- | cat
        echo OK
        

        And the same result (hangs) with #$SIG{'TSTP'} = 'IGNORE';

        $ cat capture-tiny.pl
        
        $SIG{'TSTP'} = 'IGNORE';
        use Capture::Tiny qw{tee};
        tee {
          system('bash test.bash');
        };
        
        

        Probably I do something wrong?

        PS. I have not succeed with IO:Pty script example yet, as it seems a bit complicated for me.