Как автоматизировать ожидание LSF на основе имени задания в perl

У меня есть perl-код, в котором я параллельно отправляю несколько заданий с помощью команды LSF bsub, и после завершения всех этих заданий я хочу отправить окончательное задание.

Например, у меня есть эти три команды bsub, где первые две команды bsub отправляют задания t1 и t2, а третья команда проверяет, завершены ли t1 и t2 или нет, и ждет их с аргументом -w.

   system(" bsub -E "xyz" -n 1 -q queueType -J t1 sleep 30")
    system("bsub -E "xyz" -n 1 -q queueType -J t2 sleep 30")
    system("bsub -E "xyz" -n 1 -q queueType -J t3 -w "done(t1)&&done(t2)" sleep 30")

Итак, для автоматизации аргумента -w у меня есть это

    my $count=2;
    my $i; 
   system(" bsub -E "xyz" -n 1 -q queueType -J t3 \"foreach my $i (0..$count) {print " done(t_$i)&&";}\" sleep 30 ")

Я получаю эту ошибку:

sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `bsub -E "/pkg/ice/sysadmin/bin/linux-pre-exec" -n 1 -q short -J t3 -w "foreach  (0..7) {print \"done(t)&&\";}" sleep 30'

РЕДАКТИРОВАТЬ: Да, я использую системную команду для отправки этих заданий из perl


person Heyya    schedule 04.08.2019    source источник
comment
Вы запускаете свой код Perl с помощью sh? Если да, то почему? С другой стороны, эта третья строка не похожа на Perl. Что здесь происходит?   -  person melpomene    schedule 05.08.2019
comment
Или вы имеете в виду запуск bsub из скрипта Perl с помощью So для автоматизации...?   -  person zdim    schedule 05.08.2019


Ответы (1)


Если вы хотите динамически генерировать строку done(...)&&done(...), вы можете использовать

my $count = 7;
my $done_all = join '&&', map "done(t$_)", 1 .. $count;

То есть для каждого числа в диапазоне 1 .. 7 создайте строку "done(t$_)", которая дает список "done(t1)", "done(t2)", ... "done(t7)". Элементы этого списка затем join объединены вместе с разделителем &&, что дает "done(t1)&&done(t2)&&...&&done(t7)".

Чтобы запустить внешнюю команду, вы можете использовать system. Передача списка в system позволяет избежать прохождения через оболочку, что позволяет избежать всевозможных неприятных проблем с цитированием:

system('bsub', '-E', 'xyz', '-n', '1', '-q', 'queueType', '-J', 't3', '-w', $done_all, 'sleep', '30');
# or alternatively:
system(qw(bsub -E xyz -n 1 -q queueType -J t3 -w), $done_all, qw(sleep 30));

Ваш код пытается передать код Perl в bsub, но это не сработает. Вы должны заранее сгенерировать командную строку и передать результат в bsub.

person melpomene    schedule 04.08.2019