我正在运行一个数值模型,其参数位于“ 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个人的工作,而且我担心过多的尝试可能会导致一些问题...
答案 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
循环中,该循环每隔几秒钟检查一次作业的状态。