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

How to run an array job within a pipeline of several holded jobs when the number of subjobs in the array depends on the result of a previous job

我正在尝试编写一个 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 创建的子作业数的变量或文件将不起作用。有什么想法吗?

非常感谢,

大卫

所以,如果我理解的话,job 4的submission是以job 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 所做的那样将输出解析为变量。然后在提交job 4的时候阅读这个信息:

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