以bash提交工作;在提交下一份工作之前举行

时间:2014-10-16 15:13:17

标签: bash

我需要提交大量的工作,并且我为此目的编写了一个简单的bash脚本。 我的bash脚本如下所示:

for i in {1..2}
do
mkdir "Pris_$i"
cp script.sh precip.in Zope* ./"Pris_$i"
cd ./"Pris_$i"
sed -i "s/0.505\*1/0.505\*$i/g" ./precip.in
qsub script.sh
cd ..
done

我现在想知道一种控制作业提交的方法:保持直到提交的作业完成,然后提交下一份作业。我可以使用qsub -W depend=afterok:jobID <jobname>添加依赖项,但我需要提取刚提交的作业的作业ID。我的qsub的输出如下:<jobID>.serveraddress.edu。现在,我怎么能提取这个jobID?

1 个答案:

答案 0 :(得分:0)

您可以使用类似的内容来延迟第二个作业的开始,直到第一个作业完成:

job_id=$(qsub first_job | awk -F. '{print $1}')
qsub -W depend=afterok:"$job_id" second_job

此方法仅使用awk将qsub命令的输出拆分为由.分隔的字段。第一个字段保存到变量job_id

要在循环中执行此操作,您可以将循环更改为以下内容:

for i in {1..2}; do
    mkdir "Pris_$i"
    cp script.sh precip.in Zope* ./"Pris_$i"
    cd ./"Pris_$i"
    sed -i "s/0.505\*1/0.505\*$i/g" ./precip.in
    if [[ -n "$job_id" ]]; then
        job_id=$(qsub -W depend=afterok:"$job_id" script.sh | awk -F. '{print $1}')
    else
        job_id=$(qsub script.sh | awk -F. '{print $1}')
    fi
    cd ..
done

if检查负责第一次迭代,其中没有定义先前的$job_id。对于一个简单的分隔符,例如.,也可以使用cut -d. -f1来获取ID,而不是使用awk命令。