2010-10-07 70 views
5

我想在我发送到服务器的所有作业都完成时运行脚本。如何在我的qsub作业在服务器上完成时自动运行bash脚本?

例如,我送

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

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

我将不胜感激任何意见,这将有助于我避免以下不雅的解决方案:

如果我保存每个1000个作业标识的从上面呼叫一个单独的文件,我可以检查对每个文件的内容运行作业的当前列表,即从呼叫输出:

ssh qstat 

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

回答

6

这取决于你使用的是什么作业调度和什么版本了一点,但是有可以过,如果你的成绩处理,也可以在同一个队列为完成任务采取另一种方法。

在更新版本的扭矩(以及使用Grid Engine等)中管理大量相关作业的一种非常方便的方法是将任何单个作业作为作业阵列(参见http://docs.adaptivecomputing.com/torque/4-1-4/Content/topics/commands/qsub.htm#-t)。这需要以某种方式将单个运行映射到数字,这可能会也可能不方便;但如果你可以为你的工作做到这一点,这大大简化了管理工作;你可以将它们全部排成一行,你可以一次或者全部排除它们(同时还有能力单独处理工作)。

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

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

where where analyze。sh有脚本来做分析,而427将是你发布的作业阵列的工作id。 ([]意味着全部完成后才运行)。其他调度程序(例如,SGE/OGE)的语法不同,但想法相同。获得这个权利可以采取一些行动,当然Tristan的方法具有简单的优势,并且可以与任何调度程序一起工作;但在这种情况下学习使用作业阵列,如果你会做很多这可能是值得你的时间。

6

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

1

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

我会写一个小的C程序做的等待和数据收集(如果你有权限上载和运行可执行文件),但你可以很容易地使用bash的等待内置大致相同的目的,尽管灵活性较差。

编辑:小例子。

#!/bin/bash 

... 
waitfor='' 

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

wait $waitfor 
... 

如果您在后台运行此脚本,它不会打扰你和其后的等待当你的工作已经结束线运行。

相关问题