我目前正在使用perl开发远程作业调度程序。 它必须通过ssh连接到x服务器并执行已定义的作业/作业组。
我使用Net:SSH2,它建立在libssh2上。
我的程序通常可以和400/500服务器一样正常工作,但是当我尝试在1000台服务器上运行基本的uptime
命令时,我的一个或多个线程挂起并且永远不会完成,或者就像30分钟之后。
它是随机的:有时它会按时完成,有时则不会。
我将此问题跟踪来自此Net :: SSH2命令:$in .= $buf while $chan->read( $buf, 10240 );
以下是连接的完整代码:
my $chan = $this->{netssh2}->channel() or die $!;
$chan->blocking(1);
$chan->exec($command);
my ($in,$err,$buf,$buf_err);
$in .= $buf while $chan->read( $buf, 10240 );
$err .= $buf_err while $chan->read( $buf_err, 10240, 1 );
$chan->send_eof;
1 while !$chan->eof;
$chan->wait_closed;
然后我下载了一个Net :: SSH2源包并修改了C-perl链接(xs)文件。
它告诉我问题来自这一行:
count = libssh2_channel_read_ex(ch->channel, XLATEXT, pv_buffer, size);
此命令随libssh2库一起提供:https://github.com/NLog/NLog/wiki/How-to-Log-Exceptions
有时(约1000次)该程序进入此读取并且永不离开。受影响的服务器大多数时间都是不同的。
你知道我应该寻找/检查什么吗? 我已经在这方面工作了几天,我非常喜欢外部建议:)