-1

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

  1. 将使用MyJob中的作业提交到队列currentDirectorymyJobShellFile.sh

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

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

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

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

    mpiexec ./main input我的工作数据文件夹

    我想将此行附加到

    'mpiexec ./main 输入 myJobDataFolder 0003'

  4. 我想提交MyJob给 quewhile maxIteration < 10

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

我认为人们编写 python 脚本通常是为了做这些事情,但很难找出如何去做。我可能不知道这个过程的正确术语。我也知道脚本会根据排队系统的不同而略有不同,但我们将不胜感激任何帮助。

4

1 回答 1

1

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

在下面的脚本中,我###在任何行的末尾加上我猜你在说什么的地方。以 结尾的行###可能与您实际执行的操作无关,或者可能是伪代码。无论如何,一般的想法是脚本应该执行您在项目 1 到 5 中列出的事情。此脚本假定您已修改myJobShellFile.sh为 say
mpiexec ./main input $1 $2
而不是
mpiexec ./main input
因为使用参数来修改您告诉的内容mpiexec比它更简单继续修改 shell 脚本。此外,在我看来,您希望在提交下一个作业之前而不是之后增加 maxIter。如果是这样,请从该t=$((1$maxIter+1)); maxIter=${t#1}行中删除 #。注意,请参见表单的 man bash re 扩展的“参数扩展”部分${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 的数字进行测试,请将 1000 替换为(例如)0020。这些数字中的前导零告诉 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语句测试的含义,请将单词替换whileuntil。例如,while [ ! -f abc ]; ...等价于until [ -f abc ]; ...

于 2012-11-29T22:38:52.020 回答