Распределенные и параллельные вычисления/Приложение 1
Чтобы получить список всех доступных узлов в кластере, с помощью утилиты gstat из пакета ganglia, необходимо выполнить серию команд в конвейере:
echo `gstat -a -1 -l -n| sed -e 's/ .*$//g'| paste -s -d ','| sed -e 's/,/, /g'`
Вместо команды echo можно использовать любую команду, которая будет обрабатывать список узлов, например mpirun
Аналогичную задачу можно решить с помощью скрипта на языке perl:
#!/usr/bin/perl
#-w -d
$dbg="";
$hlp="";
$hnmbr=100;
# Перебираем аргументы (параметры) коммандной строки
while ($arg = shift @ARGV)
{
if($arg eq "-d") { $dbg="true"; }
else { if($arg eq "-h" || $arg eq "--help") {$hlp="true"}
else { if($arg eq '-n') { $hnmbr=shift @ARGV; }
}
}
}
if($hlp)
{
print "-d debug mode\n";
print "-h --help prints this message\n";
exit;
}
# Определяем опрерационную систему
if($dbg) { print $^O, "\n", "Будет использовано $hnmbr хостов.\n"; }
# Получаем информацию из ganglia
$_=`gstat -a -1 -l -n`;
#$_='';
if($dbg) { print; }
# Преобразуем в массив строк
@lines=split /\n/;
$lines[0]=~m/\d+\.\d+\.\d+\.\d+/;
if ($& eq '')
{
#print 'Не возможно получить информацию из ganglia!!!';
print '127.0.0.1';
exit;
}
if ($dbg)
{
print "\n==================\n", $&, "\n==============\n";
foreach $i (@lines) { print $i.">>\n"; }
}
# Инициализация счетчика
$dlt=101;
$name=$dlt;
foreach (@lines)
{
s/[\[\],\(\)\/]/ /g;
@$name=split;
$name++;
}
# Всего узлов доступно
$atall = +@lines;
$atalli = $atall+$dlt;
# Отладочный вывод
if ($dbg) { print "Всего узлов доступно: ", $atall, "\n"; }
# Отладочный вывод
if ($dbg) { for($i=$dlt; $i < $atalli; $i++) { print "host ".$i." ip=".$$i[0]."\n"; } }
# Не обязательная инициализация массива
%asoc=();
$suf=0.0001;
$iname="";
##################################
for($i2=$dlt; $i2 < $atalli; $i2++)
{
$iname=$$i2[6]+$suf+(100-$$i2[10]);
$asoc{$iname} = $$i2[0];
$suf+=0.0001;
if ($dbg)
{
print "\n>>>", $$i2[6], "=", $$i2[0];
print "\n> ", "asoc", $iname, "=", $asoc{$iname}, "\n";
}
}
$cntr=1;
foreach $kk (sort keys %asoc)
{
$hlist.=$asoc{$kk}.", ";
if($cntr >= $hnmbr) { last; }
$cntr++;
}
$hosts = $hlist;
$hosts =~ s/..$//;
print $hosts;
__END__