当数组中的子作业数取决于前一个作业的结果时,如何在包含多个保留作业的管道中运行数组作业



我正在尝试编写一个bash脚本,该脚本将几个作业发送到集群(SGE调度器),每个作业都等待前一个作业结束,例如:

HOLD_ID=$(qsub JOB1.sh | cut -c 10-16)
HOLD_ID=$(qsub -hold_jid $HOLD_ID JOB2.sh | cut -c 10-16)
HOLD_ID=$(qsub -hold_jid $HOLD_ID JOB3.sh | cut -c 10-16)

这非常有效,但是,现在我想向这个管道添加一个保留的数组作业,例如:

qsub -hold_jid $HOLD_ID -t 1-$NB_OF_SUBJOBS JOB4.sh

但在这里,我将拥有的子作业($NB_OF_SUBJOBS)的数量取决于JOB2.sh的结果。

我希望这是一个快速的,只发送所有作业的主脚本。我不想睡一会儿或类似的东西,这是我的第一次尝试。取决于我需要的数字(JOB2.sh)的工作时间相对较长。由于最后一行是在提交时评估的,任何具有由以前的JOB2.sh创建的子作业数的变量或文件都将不起作用。有什么想法吗?

非常感谢,

David

因此,如果我理解的话,作业4的提交是基于从作业2的完成中获得信息。如果是这种情况,很明显,您需要在作业2完成后提交作业4,这与提交作业4和在作业2结束时暂停执行是分开的。

为什么不在作业2上使用-sync -y选项,使作业4的提交仅在作业2完成后发生:

qsub -hold_jid $HOLD_ID JOB2.sh -sync y

确保作业2将n_subjobs变量输出到类似文件的位置(下面的n_subjobs.txt示例),或者您可以像对作业id所做的那样将输出解析为变量。然后在提交作业4:时阅读此信息

qsub -t 1-$(cat n_subjobs.txt) JOB4.sh  

最新更新