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