#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;
Комментариев нет:
Отправить комментарий