Страницы

Поиск по вопросам

воскресенье, 8 марта 2020 г.

Perl: ошибка сегментации при параллельном подключении по SSH

#perl #ssh #распараллеливание


    #!/usr/bin/perl
use threads;
use Net::SSH::Perl;

    sub thread_routine {
        if ($i<=9) {
            $server = 's0'. $i;
        }
        else {
            $server = 's'. $i;
        }

        printf ( "Подключаемся к $server\n");
        my $ssh = Net::SSH::Perl ->new($server);
            $ssh->login("user", "xxx");
        $cmd = 'df -k';
        my ($out, $err, $exit) = $ssh->cmd($cmd);
        print ( "$out");
        return $i;
    }
foreach $i (1..10) {
push @threads,threads->create('thread_routine',$i);
}
foreach $thread (@threads) {
$thread->join();
}


Подключаемся к s01

Подключаемся к s02

Подключаемся к s03

Подключаемся к s04

...

Подключаемся к s10

Ошибка сегментирования (сделан дамп памяти)
    


Ответы

Ответ 1



Переписала код, теперь хосты берутся из файла. Вместо модуля threads использую Parallel::ForkManager. Работает, ошибки сегментации не возникает #!/usr/bin/perl -w use strict; use Parallel::ForkManager; use Net::SSH::Perl; my $max_procs = 3; my @hosts; my $timeout = 30; my $input = shift; die "Usage: $0 FILE\n" if ! $input; open (INPUT, $input) || die "Can't read '$input': $!\n"; while () { chomp ($_); my $line = $_; push @hosts, $line; } close INPUT; my $pm = new Parallel::ForkManager($max_procs); foreach my $host (@hosts) { my $pid = $pm->start() and next; print "$host \n"; my $ssh = Net::SSH::Perl ->new("$host"); $ssh->login("user", "xxx"); my $cmd = 'w'; my($out, $err, $exit) = $ssh->cmd($cmd); print "$out \n"; $pm->finish; } $pm->wait_all_children;

Комментариев нет:

Отправить комментарий