我有两个作业脚本要提交给SLURM,即jobA.sh和jobB.sh。 jobA是一个数组作业,我希望jobB仅在所有jobA完成后才开始。我的jobA.sh脚本是:

#!/bin/bash
#SBATCH -A TRIGWMS
#SBATCH --mail-type=FAIL
# cores per task
#SBATCH -c 11
#
#SBATCH --array=%#combo#%%100
#SBATCH -J %#profile#%_%#freq#%
#
# number of nodes
#SBATCH -N 1
#
#SBATCH -t 0-2:00:00
# Standard output is saved in this file
#SBATCH -o myjob_%A_%a.out
#
# Standard error messages are saved in this file
#SBATCH -e myjob_%A_%a.err
#
# set the $OMP_NUM_THREADS variable
export OMP_NUM_THREADS=12
./myjobA_$SLURM_ARRAY_TASK_ID

此作业脚本运行良好,但似乎无法让JobB在运行之后运行。 jobB具有以下脚本:
#!/bin/bash

#SBATCH -A TRIGWMS
#SBATCH --mail-type=FAIL
# cores per task
#SBATCH -c 11
#
# number of nodes
#SBATCH -N 1
#SBATCH --ntasks=1

#SBATCH -J MESA
#SBATCH -t 0-2:00:00
# Standard output is saved in this file
#SBATCH -o myjob_%A_%a.out
#
# Standard error messages are saved in this file
#SBATCH -e myjob_%A_%a.err
#
# set the $OMP_NUM_THREADS variable
ompthreads=$SLURM_JOB_CPUS_PER_NODE
export OMP_NUM_THREADS=$ompthreads
./myjobB

该脚本也可以正常工作,但前提是必须先运行jobA。为了尝试提交这两个作业,而jobB取决于jobA,我使用了以下脚本:
#!/bin/bash

FIRST=$(sbatch -p bigmem [email protected] jobA.sh)
echo $FIRST
SECOND=$(sbatch --dependency=afterany:$FIRST jobB.sh)
echo $SECOND

exit 0

但这仅提交第一个,并带有错误“sbatch:错误:无法打开文件批处理”(我原本在其中有-p bigmem --mail等,但取出来只是为了检查)。问题在于--dependency部分,一旦我删除它们,所有的都提交了,但是我需要jobB在jobA完成之后开始。

最佳答案

您应该使用--parsable选项提交您的第一份工作。

FIRST=$(sbatch -p bigmem [email protected] --parsable jobA.sh)

否则,FIRST变量包含类似于以下内容的字符串:
Submitted batch job 123456789

因此,在Bash进行变量扩展之后,第二行如下所示:
SECOND=$(sbatch --dependency=afterany:Submitted batch job 123456789 jobB.sh)

因此,sbatch实际上正在尝试查找名为batch的脚本,并使用参数job 123456789 jobB.sh运行它。使用--parsable选项,sbatch将仅以作业ID进行响应,并且您的行应按原样工作。

如果您的集群运行的Slurm版本太旧,则--parsable选项可能不可用,在这种情况下,您可以按照this advice进行操作。

关于arrays - 有一份工作取决于SLURM中的阵列工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52248393/

10-10 03:26