我绝不是 perl 或多线程方面的专家,但我确信我“做错了”,需要一些关于如何改变它的指导,这样我就不会收到线程退出警告。
如您所见,该程序读取参数 0,查找与主机名关联的每个 IP 地址,然后测试每个 IP 以查看 ssh 是否正在运行。
此脚本的目的是为每个主机生成一个 tcp 测试并返回第一个成功的 tcp 连接。
任何人都可以提出一种更可靠且不需要睡眠的方法吗?
use strict;
use warnings;
BEGIN {
use Config;
$Config{useithreads} or die('Recompile Perl with threads to run this program.');
}
use threads;
use IO::Socket::INET;
$| = 1;
unless($ARGV[0]){ die("error please use argument")}
my $timeoutval=3;
my $testHost=$ARGV[0];
my $dlquery=`dig $testHost | grep 'IN A'`;
my $SUCCESS=0;
sub testSSHhost {
my $fqdn = shift;
my $socket = new IO::Socket::INET (
PeerHost => $fqdn,
PeerPort => '22',
Proto => 'tcp',
Timeout => $timeoutval,
) or return "ERROR in Socket Creation : $!\n";
my $tcpData = <$socket>;
$socket->close();
if ($tcpData && $tcpData=~/SSH/){
print "$fqdn\n";
$SUCCESS=1;
exit(0);
}
return $fqdn;
}
my @threads;
for my $line (split(/\n/,$dlquery)){
my @linesplit=split(/ /,$line);
$linesplit[0]=~s/\.$//;
$linesplit[0]=~s/ *//g;
my $t = threads->new(\&testSSHhost, $linesplit[0]);
push(@threads,$t);
}
while (!$SUCCESS){sleep 0.3}
我真正想要避免的是“一个线程在 2 个线程运行时退出。” 错误消息或“分段错误”消息