首页 > 解决方案 > 如何通过依赖于作业列表的 sbatch 提交 SLURM 作业

问题描述

我有一个向 SLURM 提交多个作业的 shell 脚本。这些作业在以下循环中提交:

nb_partitions=72
slurmids=() # storage of slurm job ids
for k in $(seq 1 $nb_partitions); 
do
      cd results/partition$k/MainFolder
      ID=$(sbatch --parsable estimation.sh)
      slurmids+=($ID)
      cd ..
      cd ..
      cd ..
done
echo "Jobs are now running."

除了提交作业之外,此循环还创建slurmids包含所有 SLURM 作业的作业 ID 列表的数组。

现在,我有另一个我想提交的 SLURM 作业sbatch YY.sh,但该作业需要等待提交,直到所有先前的作业完成。我怎样才能做到这一点?想到的命令是sbatch --dependency=afterok<jobID1:jobID2:...:jobID72> YY.sh,我不确定如何在语句中使用我的slurmids列表。afterok

任何帮助将非常感激!

标签: bashslurmsbatch

解决方案


--dependency语法是:

afterok:job_id[:jobid...]

所以你需要用冒号分隔你的数组。您可以简单地回显整个列表并在命令中用冒号替换空格:

sbatch --dependency=afterok:$(echo ${slurmids[*]} | tr ' ' :) YY.sh

如果你只需要 slurmids 来达到这个目的,你可以通过这种方式在你的第一个脚本中连接它们:

[...]
slurmids=""
for k in $(seq 1 $nb_partitions); 
do
      cd results/partition$k/MainFolder
      slurmids="$slurmids:$(sbatch --parsable estimation.sh)"
[...]

这将产生一个$slurmids字符串,其中所有 ID 都用:和前导分隔:,因此您可以发送:

sbatch --dependency=afterok$slurmids YY.sh

推荐阅读