in reply to Re^15: Net::OpenSSH loosing lines ins reply
in thread Net::OpenSSH loosing lines ins reply

Don't call master_exited. Though that would probably not solve anything.

What is print returning?

for (@cmdout) { my $bytes = print $_; print STDERR "bytes: $bytes, err: $!\n"; }

Also, use strace in order to see what is going on at the OS level.

Replies are listed 'Best First'.
Re^17: Net::OpenSSH loosing lines ins reply
by Andy16 (Acolyte) on Jun 04, 2014 at 19:23 UTC
    Hi Salva,

    good ideas, will follow up tomorrow,
    but hard to do - as I have to read the full output line by line every time to find, if there is one missing...
    If I only count the lines - I miss the info.

    grrr...
      Good morning Salva,


      I think you lead us to the correct track... :-)


      open OUT, ">", "./trace.out"; my $line =0; foreach (@cmdout) { $line++; my $bytes = print $line.": ".$_; print OUT "$line: bytes: $bytes, err: $! \n"; } close(OUT);


      IF everything is fine trace looks like this for all lines:
      ... 1880: bytes: 1, err: Inappropriate ioctl for device 1881: bytes: 1, err: Inappropriate ioctl for device 1882: bytes: 1, err: Inappropriate ioctl for device 1883: bytes: 1, err: Inappropriate ioctl for device 1884: bytes: 1, err: Inappropriate ioctl for device ...
      IF it starts to fail:
      ... 1891: bytes: 1, err: Inappropriate ioctl for device 1892: bytes: 1, err: Inappropriate ioctl for device 1893: bytes: , err: Resource temporarily unavailable 1894: bytes: , err: Resource temporarily unavailable 1895: bytes: , err: Resource temporarily unavailable 1896: bytes: , err: Resource temporarily unavailable 1897: bytes: , err: Resource temporarily unavailable ...


      Does this ring a bell?
      update caught it in strace:
      write(1, "07651738\n1313: switchport acce"..., 4096) = 4096 write(1, ": interface Ethernet2/36\n1426: "..., 4096) = 4096 write(1, "ntrusted\n1539: service-policy "..., 4096) = 4096 write(1, "torm-control broadcast level 10."..., 4096) = 4096 write(1, "rol broadcast level 10.00\n1782: "..., 4096) = -1 EAGAIN (Re +source temporarily unavailable) write(1, "t level 10.00\n1894: service-po"..., 4096) = -1 EAGAIN (Re +source temporarily unavailable) write(1, "e-policy type queuing input N7K-"..., 4096) = -1 EAGAIN (Res +ource temporarily unavailable) write(1, "141: channel-group 1305 mode a"..., 4096) = -1 EAGAIN (Res +ource temporarily unavailable) write(1, "storm-control broadcast level 10"..., 4096) = -1 EAGAIN (Res +ource temporarily unavailable)
        write(1, "torm-control broadcast level 10."..., 4096) = 4096 write(1, "rol broadcast level 10.00\n1782: "..., 4096) = -1 EAGAIN (Re +source temporarily unavailable)

        The only plausible explanation I can think of is OpenSSH ssh setting STDOUT into non-blocking mode. BTW, how are you capturing STDOUT?

        Add a dump of /proc/$$/fdinfo:

        open OUT, ">", "./trace.out"; for (0, 1, 2) { local $/; open my $fdinfo, '<', "/proc/$$/fdinfo/$_"; my $info = <$fdinfo>; print OUT "fdinfo $_:\n$info\n\n"; } my $line =0; foreach (@cmdout) { $line++; my $bytes = print $line.": ".$_; print OUT "$line: bytes: $bytes, err: $! \n"; } close(OUT);

        The non-blocking flag is 0x4000. You may also like to generate dumps of fdinfo before the constructor call and before and after calling capture.