如何在服务器上完成qsub作业时自动运行bash脚本?

时间:2010-10-07 21:57:14

标签: bash ssh cluster-computing pbs qsub

我希望在我发送到服务器的所有作业完成后运行脚本。

例如,我发送

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

我找回已启动的工作清单。我希望在服务器上自动启动另一个脚本,以便在完成所有作业后处理这些作业的输出。

我希望有任何建议可以帮助我避免以下不优雅的解决方案:

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

ssh qstat

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

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:6)

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

在更新版本的扭矩(以及使用网格引擎等)中管理大量相关工作的一种非常方便的方法是将任何单个作业作为作业阵列启动(参见http://docs.adaptivecomputing.com/torque/4-1-4/Content/topics/commands/qsub.htm#-t)。这需要以某种方式将单个运行映射到数字,这可能是也可能不方便;但如果你可以为你的工作做到这一点,它确实大大简化了工作的管理;你可以将它们全部排成一行,你可以一次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的方法具有简单的优点,并且可以与任何调度程序一起使用;但是在这种情况下学习使用工作阵列,如果你做的很多,可能值得你花时间。

答案 2 :(得分:1)

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

我会写一个小C程序来进行等待和收集(如果你有权上传和运行可执行文件),但你可以轻松地使用内置的bash 等待同样的目的,虽然灵活性较差。

修改:小例子。

#!/bin/bash

...
waitfor=''

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

wait $waitfor
...

如果你在后台运行这个脚本,那么当你的工作结束时等待行将会运行时,它不会打扰你。