2

我正在运行一个数值模型,其参数位于“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挂起时被修改,这意味着作业n将使用错误的参数运行。(在提交作业n+1之前,我不能等待作业n完成,因为每个作业都需要几天时间才能完成)

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

我不确定如何创建一个until循环来获取作业n的状态并等到它更改为“正在运行”,然后再提交作业n+1。我已经尝试了一些东西,但我使用的服务器还托管了另外 150 个人的工作,我担心过多的实验可能会产生一些问题......

4

1 回答 1

2

使用以下命令获取最后提交的作业的 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每隔几秒检查一次作业状态的循环中。

于 2019-05-10T02:07:49.900 回答