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