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

如何在perl中根据作业名称自动执行LSF等待,perl,lsf,Perl,Lsf,我有一个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") sys

我有一个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提交这些作业。。。动态字符串,您可以使用

my $count = 7;
my $done_all = join '&&', map "done(t$_)", 1 .. $count;
也就是说,对于范围1中的每个数字。。7,生成一个字符串donet$\u,它给出一个列表donet1、donet2、。。。donet7。然后,此列表的元素与&&分隔符一起生成donet1&&donet2&&…&&donet7

要运行外部命令,可以使用。将列表传递给系统可以避免通过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。

是否使用sh运行Perl代码?若然,原因为何?另一方面,第三行看起来不像Perl。发生了什么事?或者您的意思是用Perl脚本运行bsub,尝试使用So自动化?