适用于Loadleveler作业提交的bash脚本中的嵌套直到循环嵌套行为不正确?

时间:2018-09-09 19:56:05

标签: bash nested-loops jobs loadleveler

#!/bin/bash

rm WAVECAR k_conv k_plot
#k convergence

for i in 2 4 6 8 9 10 11 12 13 14 15 16 ; 
do
    cat >KPOINTS <<!
    pymatgen 4.7.6+ generated KPOINTS with grid density = 875 / atom
    0
    Monkhorst
    $i $i $i
    !

    echo "k = $i" ; 

    b=$(llsubmit multiple.cmd) ;

    c=$(echo $b | awk '{ 
    ret=match($0,".in.") 
    rwt=match($0,"\" has")
    rqt=rwt-(ret+4)
    subs=substr($0,(ret+4),rqt)
    print subs
    }') ;

    #c stores the job id

    d=1 ;

    until [ $d -eq 0 ]
    do
        b=$(llq $c) ; #llq is the command to query job information

        d=$(echo $b | awk '{
        if ($0 ~ /mm17s003/)
            {print 1}
        else
            {print 0}
        }')
    done

    E=$(tail -1 OSZICAR) ;

    echo $i $E >> k_conv
done

awk '{print $1 "\t" $(NF-5)}' k_conv >> k_plot ; #Used to just write two specific columns from the file k_conv to k_plot.

这是我用来提交作业的脚本文件,它在每次提交作业之前更改文件KPOINTS中一个输入参数的值。 for loop是为此目的。 multiple.cmd是实际的作业提交脚本,而llsubmit是负载均衡器的作业提交命令。

nested until loop用于查询特定已提交作业的作业状态。除非工作结束,否则此循环将不断重复。作业完成并且until loop结束后,将生成输出文件OSZICAR。 Awk用于提取特定的行,然后将其存储在E中。最后,for循环变量i(即用于脚本更改的计算的输入参数)和E存储在文件{ {1}}。 k_conv的结尾。

本质上,由于for loop一次只能提交一份作业。完成后,下一个until loop迭代开始,并提交新作业。运行脚本时,对于for loop作业的任何两个或三个随机值会同时提交。我假设i有问题。

最初存储在b中的until loop的输出:llsubmit multiple.cmd

c将作业ID(上例中的llsubmit: The job "c1hn1.virgo.iitm.ac.in.2077655" has been submitted.)作为其值。

稍后存储在b中的2077655的输出:llq $c

非常感谢您的帮助。

0 个答案:

没有答案