完成工作后提交批量工作

时间:2012-11-29 19:49:18

标签: bash batch-file

我想编写一个脚本来执行下面列出的步骤。如果有人可以提供有关如何使用脚本修改文件和搜索文件夹的简单示例(不一定在下面解决我的问题),我将非常感激。

  1. 使用MyJobcurrentDirectory提交作业myJobShellFile.sh

  2. 完成MyJob后,转到currentDirectory/myJobDataFolder。 在myJobDataFolder中,有文件夹

    myJobData.0000 myJobData.0001 myJobData.0002 myJobData.0003

    我想找到所有列出文件夹的最大数量maxIteration。这里是maxIteration=0003。<

  3. 在文件myJobShellFile.sh中,最后一行显示

    mpiexec ./main input myJobDataFolder

    我想将此行附加到

    'mpiexec ./main输入myJobDataFolder 0003'

  4. 我想将MyJob提交给while maxIteration < 10

  5. 完成MyJob后,找到新的maxIteration并在myJobShellFile.sh中更改此号码并转到第4步。

  6. 我认为人们通常会编写python脚本来做这些事情,但我很难找到方法。我可能不知道这个程序的正确术语。我也知道脚本会根据排队系统略有不同,但我们将非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您的问题的几个方面尚不清楚,例如“使用myJobShellFile.sh将当前目录中的作业MyJob提交给que”的含义,“将此行附加到 'mpiexec ./main输入myJobDataFolder 0003'“,如何检测作业何时完成,myJobShellFile.sh的相关部分以及其他一些细节。如果您可以列出在每次迭代的作业提交中使用的特定shell命令,那么您可以使用bash标记而不是python发布更好的问题。

在下面的脚本中,我在任何一行的末尾放了一个###,我在猜猜你在说什么。以###结尾的行可能与您实际执行的操作无关,也可能是伪代码。无论如何,一般的想法是脚本应该执行您在项目1到5中列出的内容。此脚本假定您已修改myJobShellFile.sh以说明了 mpiexec ./main input $1 $2
而不是 mpiexec ./main input
因为使用参数修改你告诉mpiexec的内容比修改shell脚本更简单。此外,在我看来,你想在提交下一份工作之前增加maxIter,而不是之后。如果是,请从t=$((1$maxIter+1)); maxIter=${t#1}行中删除#。注意,请参阅man bash重新扩展${var#txt}表单的“参数扩展”部分,以及“算术扩展”部分重新$((expression))表单。 1$maxIter和类似表单用于将0018(不是有效的bash编号,因为8不是八进制数字)更改为10018

#!/bin/sh
./myJobShellFile.sh MyJob    ###
maxIter=0
while true; do 
   waitforjobcompletion      ###
   cd ./myJobDataFolder
   maxFile= $(ls myJobData* | tail -1)
   maxIter= ${maxFile#myJobData.}  #Get max extension
   # If you want to increment maxIter, uncomment next line
   # t=$((1$maxIter+1)); maxIter=${t#1} 
   cd ..
   if [[ 1$maxIter -lt 11000 ]] ; then
      ./myJobShellFile.sh MyJobDataFolder $maxIter
   else
      break
   fi
done

注意:(1)要测试小于1000次提交的运行,请将11000替换为10000 + n;例如,要执行123次运行,请将其替换为10123.(2)在编写上述脚本时,我假设输出目录中不常出现的数据不常出现在输出目录中。相反,如果每次运行只显示一个输出文件,并且您只想为值0000,0001,0002,0999,1000为每个值执行一次运行,则使用如下所示的脚本。 (对于小于1000的测试,用(例如)0020替换1000.这些数字中的前导零告诉bash用前导零填充生成的数字。)

#!/bin/sh
for iter in {0000..1000}; do
   ./myJobShellFile.sh MyJobDataFolder $iter
   waitforjobcompletion      ###
done

(3)如果系统有一个命令在等待超级计算资源上的作业完成时休眠,则在上述脚本中使用该命令代替waitforjobcompletion是合理的。否则,如果系统的命令jobisrunning在作业仍在运行时返回true,请将waitforjobcompletion替换为以下内容:

while jobisrunning ; do sleep 15; done

这将运行jobisrunning命令;如果它返回true,shell将休眠15秒然后重新测试。下面是一个示例,说明等待文件出现然后让它消失:

while [ ! -f abc ]; do sleep 3; echo no abc; done
while ls abc >/dev/null 2>&1; do sleep 3; echo an abc; done

第二行的测试可能是[ -f abc ];我展示了一个更长的例子来说明如何通过将输出和错误消息路由到/ dev / null来抑制它们。 (4)要颠倒while语句测试的意义,请将while替换为until。例如,while [ ! -f abc ]; ...相当于until [ -f abc ]; ...