linux 一个接一个地提交一系列作业的Bash脚本?

g6baxovj  于 2022-11-22  发布在  Linux
关注(0)|答案(1)|浏览(139)

我想使用bash脚本依次运行一系列作业,calculation_02等。有输入文件位于(命名为 *.in),应使用“mpirun”和相应的runbinary调用。提供的脚本同时运行所有 *.in文件,因此第一个目录“calculation_01”中的第一个作业失败,第二个目录“calculation_02”中的第二个作业正常终止。

#!/bin/bash

OutputFiles=()
CurrDir=$PWD
#outer for-loop to start the calculation within each directory
for dir in $CurrDir/calculation_*/
do
    cd $dir;
    #executable for running the input file *.in
    mpirun -n 4 *.in 
    #executable creates the output-file *.out in each directory
    files="/calculation_*/*.out"
    #inner for-loop to validate the output-file *.out whether the calculation has ended properly in each directory
    for outfile in *.out
    do
        if [[ "$(grep 'Normal Termination' $outfile)" != "" ]]
        then    
            OutputFiles+=(${outfile#*_})
        fi
    done    
done

因此,我认为for循环的逻辑有问题。我需要重写哪一行代码,以便在第一个目录“calculation_01”中启动第一个计算,并验证它是否正常终止,如果正常终止,则在第二个目录“calculation_02”中启动第二个作业?
我很感激任何帮助!

xqk2d5yq

xqk2d5yq1#

感谢您的宝贵意见。每当我通过将脚本发送到后台(如./script.sh &)来调用脚本时,我发现它在一个目录中成功完成了一次计算,但在第二个目录中失败了,因为它试图同时访问第二个目录。这导致了I/O故障。
解决方案是使用PID,并等待完成一个目录中的作业,然后在第二个目录中开始下一个计算。

#!/bin/bash

declare -a pids
CurrDir=$PWD
#outer for-loop to start the calculation within each directory
for dir in $CurrDir/calculation_*/
do
    cd $dir;
    echo "$PWD"
    #executable for running the input file *.in
    mpirun -n 4 *.in 
    #executable creates the output-file *.out in each directory
    files="/calculation_*/*.out"
    #inner for-loop to validate the output-file *.out whether the calculation has ended properly in each directory
    for f in $files 
    do
      if grep -i "Normal Termination" $f
      then
      echo "Completed Successfully"
      grep -w "Energy" $f >> energy.txt
      fi
    done    
)
pids+=($!)
wait ${pids[*]}
done

相关问题