我有一堆作业要提交到PBS队列,然后输出应该在本地进行后处理。由于作业类似(并且我不想经常手动更改它),我自己编写了一个bash脚本,在本地生成PBS作业脚本,然后提交作业。 我的问题如下:如何使我的bash脚本等到PBS作业完成然后开始后处理? (不断检查工作状态不是一种选择。)我有什么可能做到这一点?
非常感谢所有提示,技巧或解决方案!
编辑:如评论(谢谢)中所示,进行了一些编辑:
编辑2: 由于我不确定我是否可以按照下面的建议进行交互式运行,因此我考虑了以下内容:我在完成之前让PBS作业脚本创建一个(空)文件。我的bash脚本检查每隔几分钟(比如说)是否存在该文件(使用while循环)。如果存在,我知道作业已终止,可以通过删除刚创建的(空)文件来开始后处理。这样,我最多只有几分钟的延迟,并不需要任何资源。这绝对不是理想的,而是一种解决方法。 任何更实用的想法都受到高度赞赏。
即使与PBS没有直接关系,任何想法都会受到赞赏。
卡里
答案 0 :(得分:0)
我不相信PBSPro支持这一点,但是TORQUE(另一个PBS衍生产品)有一个您可能感兴趣的-x选项。您可以提交这样的工作:
qsub -I -x <executable>
这将以交互方式运行您的作业并运行可执行文件,并将所有输出定向到您的终端,并且该作业将在该可执行文件终止后立即执行。然后,您可以在该点开始后处理。 PBSPro可能具有类似的功能,但我在这里描述的是TORQUE。
答案 1 :(得分:0)
这与an answer I wrote to a different question有关。我可以访问校园高性能计算中心的几台机器。在至少一个集群上,允许从父PBS脚本调用qsub
。这允许按this page所述进行作业链接。因此,您可以使用类似以下框架的解决方案:
# ...do your PBS stuff
# launch your code on the cluster that creates, say "JOBID.txt"
parallel -j0 mycode.sh
# you may need to use PBS environment variables to figure out what your output file is called
filename=$${PBS_JOBID%%.*}.txt # e.g., this would be like the JOBID.txt I wrote above
# next, use qsub to launch the post-processing script
echo "${PBS_O_WORKDIR}/postprocess.pbs $filename" | qsub
posprocess.pbs
会将文件名作为参数处理。在我链接的答案中,这有助于我在完成后将PBS标准输出文件复制到另一个文件。但是,我不确定可能的竞争条件,您可能需要使用-W depend=
qsub选项,类似这样(未经测试):
echo "-W depend=afterok:$PBS_JOBID postprocess.pbs $filename" | qsub