我正在使用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
“保持”?
答案 0 :(得分:2)
答案 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