如何通过依赖于作业列表的 sbatch 提交 SLURM 作业

How to submit a SLURM job via sbatch that depends on a list of jobs

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

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 提交,但是这个作业需要等到 all 个以前的作业才能提交结束。我怎样才能做到这一点?想到的命令是 sbatch --dependency=afterok<jobID1:jobID2:...:jobID72> YY.sh,我不确定如何在 afterok 语句中使用我的 slurmids 列表。

如有任何帮助,我们将不胜感激!

--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