提交多个作业时,如何让 sbatch 等到最后提交的作业是 *运行*?
How to make sbatch wait until last submitted job is *running* when submitting multiple jobs?
我正在 运行 建立一个数值模型,其参数在 "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[ 时被修改=35=] 待定,这意味着作业 n 将 运行 使用错误的参数。 (而且我等不及作业 n 完成才提交作业 n+1 因为每个作业都需要几天才能完成)
如何强制批处理等待提交作业 n+1 直到作业 n 为 运行宁?
我不确定如何创建一个 until
循环来获取作业 n 的状态并等到它变为 'running' 后再提交工作 n+1。我已经尝试了一些东西,但我使用的服务器还承载了另外 150 人的工作,我担心太多的实验可能会产生一些问题...
使用以下命令获取上次提交的作业的 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
在提交下一个作业之前检查作业状态是否为 'running':
if [ "$jobstatus" = "R" ];then
# insert here relevant code to run next job
fi
您可以在 until
循环中插入最后一个片段,每隔几秒检查一次作业的状态。
我正在 运行 建立一个数值模型,其参数在 "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[ 时被修改=35=] 待定,这意味着作业 n 将 运行 使用错误的参数。 (而且我等不及作业 n 完成才提交作业 n+1 因为每个作业都需要几天才能完成)
如何强制批处理等待提交作业 n+1 直到作业 n 为 运行宁?
我不确定如何创建一个 until
循环来获取作业 n 的状态并等到它变为 'running' 后再提交工作 n+1。我已经尝试了一些东西,但我使用的服务器还承载了另外 150 人的工作,我担心太多的实验可能会产生一些问题...
使用以下命令获取上次提交的作业的 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
在提交下一个作业之前检查作业状态是否为 'running':
if [ "$jobstatus" = "R" ];then
# insert here relevant code to run next job
fi
您可以在 until
循环中插入最后一个片段,每隔几秒检查一次作业的状态。