1

我有一堆作业要提交到 PBS 队列,并且输出应该在之后在本地进行后处理。由于作业相似(而且我不想经常手动更改它),我自己编写了一个 bash 脚本,它在本地生成一个 PBS 作业脚本,然后提交作业。我的问题如下:如何让我的 bash 脚本等到 PBS 作业完成然后开始后处理?(不断检查工作的状态不是一种选择。)我有什么可能这样做?

非常感谢您提供的所有提示、提示或解决方案!

编辑:如评论中所示(谢谢),一些编辑:

  • PBS = 便携式批处理系统
  • 文档可在此处获得:http: //resources.altair.com/pbs/documentation/support/PBSProUserGuide12.1.pdf
  • 我考虑了可能的解决方案,并提出了以下一个不起作用的解决方案:我可以让我的 bash 脚本等待所请求的时间作为工作的挂钟时间。然而,有两个复杂性:首先,作业可能不需要那么多时间并提前终止,因此 bash 脚本等待时间过长;其次,作业可能会排队而不是立即执行,因此 bash 脚本可能等待的时间太少。

编辑 2:由于我不确定我是否总是可以按照下面的建议以交互方式运行,所以我考虑了以下问题:我让 PBS 作业脚本在完成之前创建一个(空)文件。我的 bash 脚本每隔几分钟(例如)检查该文件是否存在(使用 while 循环)。如果存在,我知道该作业已终止,可以通过删除刚刚创建的(空)文件开始后处理。这样,我最多只能延迟几分钟,并且不需要任何资源。这绝对不是理想的,而是一种解决方法。任何更实用的想法都会受到高度赞赏。

即使与 PBS 没有直接关系,任何想法都会受到赞赏。

卡里

4

2 回答 2

0

这与我写给另一个问题的答案有关。我可以使用校园高性能计算中心的几台机器。在至少一个集群上,允许qsub从父 PBS 脚本调用。这允许作业链接,如本页所述。因此,您可以使用类似以下框架的解决方案:

# ...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
于 2014-01-17T22:06:44.420 回答
0

我不相信 PBSPro 支持这一点,但 TORQUE(另一种 PBS 衍生产品)有一个您可能感兴趣的 -x 选项。您可以提交这样的工作:

qsub -I -x <executable>

这将以交互方式运行您的作业并运行可执行文件,并将所有输出定向到您的终端,并且该作业将在该可执行文件终止后立即执行。然后您就可以开始后处理了。PBSPro 可能有类似的功能,但我在这里描述的是 TORQUE。

于 2013-08-23T17:16:35.000 回答