如何根据perl中的作业名称自动执行LSF等待

How to automate the LSF waiting based on job name in 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 提交这些作业

如果要动态生成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'd 与分隔符 && 一起生成 "done(t1)&&done(t2)&&...&&done(t7)".

要运行一个外部命令,可以使用system。将列表传递给 system 避免通过 shell,这避免了各种讨厌的引用问题:

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.