2010-10-07 30 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 
... 

如果您在後臺運行此腳本,它不會打擾你和其後的等待當你的工作已經結束線運行。

相關問題