Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何使这更快?_Perl - Fatal编程技术网

Perl 如何使这更快?

Perl 如何使这更快?,perl,Perl,我有一个Perl脚本,它使用SSH登录文本文档上的服务器,或者您选择要使用的脚本,并执行set命令 这个脚本花了太长的时间来浏览一个列表,比如70个,有时它也会随机停止。它说它仍在执行脚本,但它停止发送命令 我需要一种方法来防止它结冰,并且让它跑得更快 #!/usr/bin/perl use Net::SSH2; open(fh,'<','servers.txt'); @newarray; while (<fh>){ @array = split(':',$_); push(

我有一个Perl脚本,它使用SSH登录文本文档上的服务器,或者您选择要使用的脚本,并执行set命令

这个脚本花了太长的时间来浏览一个列表,比如70个,有时它也会随机停止。它说它仍在执行脚本,但它停止发送命令

我需要一种方法来防止它结冰,并且让它跑得更快

#!/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;