您的问题的很多方面都不清楚,例如“使用 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
语句测试的含义,请将单词替换while
为until
。例如,while [ ! -f abc ]; ...
等价于until [ -f abc ]; ...
。