7

当我发送到服务器的所有作业都完成后,我想运行一个脚本。

例如,我发送

ssh server "for i in config*; do qsub ./run 1 $i; done"

我得到了一份已经开始的工作清单。一旦完成,我想在服务器上自动启动另一个脚本来处理这些作业的输出。

如果有任何建议可以帮助我避免以下不雅的解决方案,我将不胜感激:

如果我将上述调用中的 1000 个作业 ID 中的每一个保存在一个单独的文件中,我可以根据当前正在运行的作业列表检查每个文件的内容,即来自调用的输出:

ssh qstat

我只需要每半小时检查一次,但我想有更好的方法。

4

3 回答 3

8

这在一定程度上取决于您使用的作业调度程序和版本,但是如果您的结果处理也可以在与作业相同的队列上完成,那么也可以采用另一种方法。

在较新版本的扭矩(以及网格引擎等)中管理大量相关作业的一种非常方便的方法是将任何单个作业作为作业数组启动(参见http://docs.adaptivecomputing.com/torque /4-1-4/Content/topics/commands/qsub.htm#-t)。这需要以某种方式将单个运行映射到数字,这可能方便也可能不方便;但是,如果您可以为您的工作做到这一点,它确实大大简化了工作管理;您可以在一行中将它们全部 qsub,您可以一次全部 qdel 或 qhold (同时仍然有能力单独处理工作)。

如果你这样做,那么你可以提交一个分析作业,它依赖于作业数组,只有在数组中的所有作业完成后才会运行:(参见http://docs.adaptivecomputing.com/torque /4-1-4/Content/topics/commands/qsub.htm#dependencyExamples)。提交作业如下所示:

qsub analyze.sh -W depend=afterokarray:427[]

其中analyze.sh 有执行分析的脚本,427 将是您启动的作业数组的作业ID。([] 表示仅在全部完成后运行)。其他调度程序(例如,SGE/OGE)的语法不同,但想法是相同的。

要做到这一点需要做一些事情,当然 Tristan 的方法具有简单的优点,并且可以与任何调度程序一起使用。但是如果你会做很多这样的事情,学习在这种情况下使用工作数组可能值得你花时间。

于 2010-10-12T02:46:20.527 回答
6

您可能会考虑让每个作业脚本只需触摸专用文件夹中的文件名,例如$i.jobdone,在您的主脚本中,您可以简单地使用ls *.jobdone | wc -l来测试完成的正确数量的作业。

于 2010-10-07T22:47:36.740 回答
1

您可以使用wait停止执行,直到完成所有作业。如果您循环等待特定的 id,您甚至可以收集所有退出状态和其他运行统计信息(花费的时间、当时完成的作业数等)。

我会编写一个小的 C 程序来进行等待和收集(如果您有权上传和运行可执行文件),但是您可以轻松地使用内置的 bash wait来实现大致相同的目的,尽管灵活性较低。

编辑:小例子。

#!/bin/bash

...
waitfor=''

for i in tasks; do
    task &
    waitfor="$waitfor $!"
done

wait $waitfor
...

如果你在后台运行这个脚本,它不会打扰你,当你的工作结束时,等待线之后的任何东西都会运行。

于 2010-10-08T08:36:18.397 回答