提交多个作业时,如何让sbatch等到最后提交的作业正在运行?

时间:2019-05-09 23:09:31

标签: bash slurm sbatch

我正在运行一个数值模型,其参数位于“ parameter.input”文件中。我使用sbatch提交模型的多次迭代,每次更改参数文件中的一个参数。这是我使用的循环:

#!/bin/bash -l
for a in {01..30}
do
  sed -i "s/control_[0-9][0-9]/control_${a}/g" parameter.input
  sbatch --time=21-00:00:00 run_model.sh
  sleep 60
done

sed行更改了参数文件中的参数。的 run_model.sh文件运行模型。

问题:根据可用资源,作业可能会立即运行或停留几个小时。在我的默认循环中,如果60秒钟的时间不足以查找作业 n 的运行资源,则在作业 n 待处理时将修改参数文件,这意味着作业< em> n 将使用错误的参数运行。 (而且我迫不及待要完成作业 n ,然后再提交作业 n + 1 ,因为每个作业都需要几天才能完成)

如何强制批处理等待提交作业 n + 1 直到作业 n 运行?

我不确定如何创建一个until循环,该循环将获取作业 n 的状态并等待其变为“正在运行”,然后再提交作业 n + 1 。我已经做了一些尝试,但是我使用的服务器还可以容纳另外150个人的工作,而且我担心过多的尝试可能会导致一些问题...

1 个答案:

答案 0 :(得分:0)

使用以下命令获取上次提交的作业的ID及其状态,并等待其不再挂起以开始下一个作业:

sentence=$(sbatch --time=21-00:00:00 run_model.sh) # get the output from sbatch
stringarray=($sentence)                            # separate the output in words
jobid=(${stringarray[3]})                          # isolate the job ID
sentence="$(squeue -j $jobid)"            # read job's slurm status
stringarray=($sentence) 
jobstatus=(${stringarray[12]})            # isolate the status of job number jobid

在提交下一个作业之前,请检查作业状态是否为“正在运行”:

if [ "$jobstatus" = "R" ];then
  # insert here relevant code to run next job
fi

您可以将最后一个代码段插入until循环中,该循环每隔几秒钟检查一次作业的状态。