Perl 如何使这更快?
我有一个Perl脚本,它使用SSH登录文本文档上的服务器,或者您选择要使用的脚本,并执行set命令 这个脚本花了太长的时间来浏览一个列表,比如70个,有时它也会随机停止。它说它仍在执行脚本,但它停止发送命令 我需要一种方法来防止它结冰,并且让它跑得更快Perl 如何使这更快?,perl,Perl,我有一个Perl脚本,它使用SSH登录文本文档上的服务器,或者您选择要使用的脚本,并执行set命令 这个脚本花了太长的时间来浏览一个列表,比如70个,有时它也会随机停止。它说它仍在执行脚本,但它停止发送命令 我需要一种方法来防止它结冰,并且让它跑得更快 #!/usr/bin/perl use Net::SSH2; open(fh,'<','servers.txt'); @newarray; while (<fh>){ @array = split(':',$_); push(
#!/usr/bin/perl
use Net::SSH2;
open(fh,'<','servers.txt');
@newarray;
while (<fh>){
@array = split(':',$_);
push(@newarray,@array);
}
$a=0;
$b=1;
$c=2;
while ($c <= scalar(@newarray)){
$ssh = Net::SSH2->new();
if ($ssh->connect($newarray[$c])) {
if ($ssh->auth_password($newarray[$a],$newarray[$b])) {
$channel = $ssh->channel();
$channel->exec('cd /tmp && perl p.pl');
$channel->close;
print "Command sent to --> ".$newarray[$c]."\n";
} else {
print "Could not authenticate to host $newarray[$c]\n";
}
} else {
print "Could not connect to host $newarray[$c]\n";
}
$a += 3;
$b += 3;
$c += 3;
}
您可以轻松地将任务与
我们还没有看到你的脚本。代码太长了,你可以在代码处看到代码。最初,我们甚至连一点努力都没有,我们不得不将代码推给你。请说明您尝试了什么以及失败的原因。我们不是来为你做工作的是的,谢谢你,前两次你发布链接时,很明显代码在哪里。你不需要一直提醒我们,就好像我们是你的私人开发团队一样。更新问题,包括您试图实现的目标、您尝试过的目标、基准和统计数据、您认为失败的原因或瓶颈所在的详细信息。好的,这个脚本的问题是,它不是在所有服务器上执行命令,而是在列表中的第一个服务器上执行多次,例如,假设列表是admin:admin:1.1.1 admin:admin:2.2.2,脚本应该在两台服务器上执行命令,并说命令发送到->1.1.1和命令发送到->2.2.2,但是它只是一遍又一遍地说命令发送到->1.1.1.1。@user3678068:这不起作用,因为不是一次将命令发送到所有服务器,而是所有十个线程都在做同样的事情。他们每个人都有自己的@newarray的私有副本。标识符的选择非常好,您所做的就是将要做的工作乘以十倍。您需要将参数从主进程传递给线程,以告诉每个线程它们应该是什么doing@Borodin,感谢您发现错误。已经纠正了。
#!/usr/bin/perl
use Net::SSH2;
use Parallel::ForkManager;
#######################
# Written by Iyzan #
#######################
open(fh,'<','servers.txt');
@newarray;
while (<fh>){
@array = split(':',$_);
push(@newarray,@array);
}
# make 10 workers
my $pm = new Parallel::ForkManager(10);
for (my $i=0; $i < scalar(@newarray); $i+=3) {
# fork a worker
$pm->start and next;
$a = $i;
$b = $i+1;
$c = $i+2;
$ssh = Net::SSH2->new();
if ($ssh->connect($newarray[$c])) {
if ($ssh->auth_password($newarray[$a],$newarray[$b])) {
$channel = $ssh->channel();
$channel->exec('cd /tmp && perl p.pl');
$channel->close;
print "Command sent to --> ".$newarray[$c]."\n";
} else {
print "Could not authenticate to host $newarray[$c]\n";
}
} else {
print "Could not connect to host $newarray[$c]\n";
}
# exit worker
$pm->finish;
}
$pm->wait_all_children;