有一份工作取决于 SLURM 中的数组作业

Having a job depend on an array job in SLURM

我有两个作业脚本要提交给 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

这个作业脚本 运行 很好,但我似乎无法在它完成后将作业 B 转到 运行。 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 --mail-user=$USER@something.ac.uk jobA.sh)
echo $FIRST
SECOND=$(sbatch --dependency=afterany:$FIRST jobB.sh)
echo $SECOND

exit 0

但这只提交了第一个并带有错误 'sbatch: error: Unable to open file batch'(我最初在那里有 -p bigmem --mail 等,但为了检查而把它拿出来)。问题出在 --dependency 部分,一旦我删除所有这些部分都已提交,但我需要 jobB 在 jobA 完成后开始。

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

FIRST=$(sbatch -p bigmem --mail-user=$USER@something.ac.uk --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.