http://www.perlmonks.org?node_id=1041208


in reply to using Net::OpenSSH in a MCE worker thread

Activate the module debugging mode...
$Net::OpenSSH::debug = -1;
and post here what you get.

Replies are listed 'Best First'.
Re^2: using Net::OpenSSH in a MCE worker thread
by marioroy (Prior) on Dec 13, 2014 at 03:25 UTC
    Hi all,

    MCE has gone through several revisions since the time the OP tested this. I tested without IO::Pty on my box. Amazingly, running (yum install perl-Net-OpenSSH) installed the package without checking the perl-IO-Tty dependency.

    Workers in older MCE revisions closed STDOUT/STDERR prior to exiting. That was fix some time back.

    $ ./mce_openssh.pl child(1): doing ssh unable to load Perl module IO::Pty: Can't locate IO/Pty.pm in @INC (@I +NC contains: /media/psf/shm/trunk/examples/../lib /usr/local/lib64/pe +rl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/pe +rl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at (eval 10) lin +e 1, <__ANONIO__> line 2. at /usr/share/perl5/vendor_perl/Net/OpenSSH.pm line 756.

    Btw, the script works after installing IO::Tty (yum install perl-IO-Pty).

    my $sshuser = 'remote_userid'; my $sshpwd = 'remote_passwd'; my $device = 'remote_device'; use MCE::Flow max_workers => 1; use Net::OpenSSH; mce_flow sub { my $wid = MCE->wid; MCE->sendto('stdout', "child($wid): doing ssh\n"); my $ssh = Net::OpenSSH->new( $device, user => $sshuser, passwd => $sshpwd, master_opts => [-o => "StrictHostKeyChecking=no"], master_stderr_discard => 1 ); MCE->sendto('stdout', "child($wid): did ssh - not shown!!! \n"); };

    In summary, STDERR output is no longer lost with current MCE releases.

Re^2: using Net::OpenSSH in a MCE worker thread
by Andy16 (Acolyte) on Jun 28, 2013 at 10:51 UTC
    Hi - sorry, but
    => debug did not do any lines
    => no furhter message than "just gone" ....

    meanwhile (see above) I'm sure it is realted to an eval loading a missing pm...

    thanks!

      taken from OpenSSH.pm


      sub _load_module { my ($module, $version) = @_; $loaded_module{$module} ||= do { do { local ($@, $SIG{__DIE__}); eval "require $module; 1" } or croak "unable to load Perl module $module"; 1 }; if (defined $version) { local ($@, $SIG{__DIE__}); my $mv = eval "\$${module}::VERSION" || 0; (my $mv1 = $mv) =~ s/_\d*$//; croak "$module version $version required, $mv is available" if $mv1 < $version; } 1 }


      somewhere in here it breaks... if pm not preloaded and in MCE context.

        oops, there is a bug in that part of the code that causes it to fail silently (instead of failing with an error that tells you what has gone wrong).

        Try replacing it by the following version:

        sub _load_module { my ($module, $version) = @_; $loaded_module{$module} ||= do { do { local ($@, $SIG{__DIE__}); eval "require $module; 1" } or croak "unable to load Perl module $module"; 1 }; if (defined $version) { my $mv = do { local ($@, $SIG{__DIE__}); eval "\$${module}::VERSION" || 0; }; (my $mv1 = $mv) =~ s/_\d*$//; croak "$module version $version required, $mv is available" if $mv1 < $version; } 1 }