如何完成一个脚本直到一个slurm作业(从srun开始)完全结束?

时间:2017-09-26 12:52:45

标签: cluster-computing slurm

我正在使用SLURM运行一个作业数组,其中包含以下作业数组脚本(我使用sbatch job_array_script.sh [args]运行:

#!/bin/bash

#SBATCH ... other options ...

#SBATCH --array=0-1000%200

srun ./job_slurm_script.py $1 $2 $3 $4

echo 'open' > status_file.txt

为了解释,我希望job_slurm_script.py作为一个数组作业运行1000次,最多并行200个任务。当所有完成后,我想向status_file.txt写'打开'。这是因为实际上我有超过10,000个作业,这超出了我的集群的MaxSubmissionLimit,所以我需要将它拆分成更小的块(在1000个元素的作业数组中)并一个接一个地运行它们(仅在前一个完了)。

但是,要使其工作,echo语句只能在整个作业数组完成后触发(在此之外,我有一个循环检查status_file.txt,以便查看作业是否完成,即内容是字符串'open')。

到目前为止,我认为srun会保留脚本,直到整个作业数组完成。但是,有时srun“返回”并且脚本在作业完成之前转到echo语句,因此所有后续作业都会从群集中跳出,因为它超出了提交限制。

那么在整个作业数组完成之前,如何让srun“保持”?

3 个答案:

答案 0 :(得分:2)

您可以将标记--wait添加到sbatch

查看sbatch的手册页,了解有关--wait

的信息

答案 1 :(得分:0)

您可以结合使用bash中--wait中的sbatch选项和wait来将作业发送到群集,暂停脚本执行直到完成,然后再继续。例如

#!/bin/bash
set -e
date

for((i=0; i<5; i++)); do
    sbatch -W --wrap='echo "hello from $SLURM_ARRAY_TASK_ID eat $VAR"; sleep 10' &
done;
wait

date
echo "I am finished"

答案 2 :(得分:-1)

您可以使用wait bash命令。它将等到上面的任何代码行完成。因此,您的脚本应如下所示:

#!/bin/bash

#SBATCH ... other options ...

#SBATCH --array=0-1000%200

srun ./job_slurm_script.py $1 $2 $3 $4

wait

echo 'open' > status_file.txt