2012-07-17 176 views
23

我有一個批處理腳本,它開始了幾個qsub作業,並且我想在它們全部完成時進行陷阱。等待一組qsub作業完成

我不想使用-sync選項,因爲我想讓它們同時運行。每個作業都有一組不同的命令行參數。

我希望我的腳本能夠等到所有的工作都完成後再做一些事情。我不想使用睡眠功能,例如檢查每隔30秒後是否生成了某些文件,因爲這會消耗資源。

我相信扭矩可能有一些選擇,但我正在運行SGE。

關於如何實現這一點的任何想法嗎?

謝謝 P.s. 我發現另一個線程 Link

其中有一個效應初探

您可以使用等待停止執行,直到所有的作業都完成。您甚至可以收集所有退出狀態和其他正在運行的統計信息(所花費的時間,當時完成的工作計數等等),如果您在等待特定ID時循環。

但我不知道如何使用它沒有投票的一些價值。可以使用bash陷阱,但我將如何使用qsub?

+0

你是對的,有一種方法可以在TORQUE中做到這一點。我不知道SGE是否可以選擇這樣做。 – dbeer 2012-07-20 22:25:36

回答

3
qsub -hold_jid job1,job2,job3 -cwd ./myscript 
+9

爲了提高你的文章的質量,請包括你的文章爲什麼/如何解決問題。 – 2012-09-22 17:29:37

24

啓動您的qsub工作,使用-N選項給他們任意名稱(JOB1,JOB2等):

qsub -N job1 -cwd ./job1_script 
qsub -N job2 -cwd ./job2_script 
qsub -N job3 -cwd ./job3_script 

啓動腳本,並告訴它要等到就業名爲JOB1 ,JOB2和作業3開始之前完成:

qsub -hold_jid job1,job2,job3 -cwd ./results_script 
+0

這似乎不工作,如果作業列表太長(我有40個工作,命令結束了940個字符......) – naught101 2016-09-16 06:56:19

+1

Hrm ..不,這不是問題。這是PBS Pro使用不同的格式。你需要使用'-W depend = afterok: [::...]' – naught101 2016-09-19 01:19:17

1

另一種選擇(從here)如下:

FIRST=$(qsub job1.pbs) 
echo $FIRST 
SECOND=$(qsub -W depend=afterany:$FIRST job2.pbs) 
echo $SECOND 
THIRD=$(qsub -W depend=afterany:$SECOND job3.pbs) 
echo $THIRD 

洞察力是qsub返回jobid,這通常被轉儲到標準輸出。而是將它捕獲到一個變量中($FIRST,$SECOND, $THIRD),並在排列作業以控制它們何時出列的依賴關係結構時使用-W depend=afterany:[JOBIDs]標誌。

1

如果您有150個文件需要處理,並且每次只能運行15個文件,而另一個文件則保留在隊列中,您可以設置類似這樣的內容。

# split my list files in a junk of small list having 10 file each 
awk 'NR%10==1 {x="F"++i;}{ print > "list_part"x".txt" }' list.txt 

的qsub以這樣的方式,第一各個list_part的* .TXT舉辦第二屆一個所有作業....第二個舉辦第三個.....等等。

for list in $(ls list_part*.txt) ; do 
    PREV_JOB=$(qsub start.sh) # create a dummy script start.sh just for starting 
for file in $(cat $list) ; do 
    NEXT_JOB=$(qsub -v file=$file -W depend=afterany:$PREV_JOB myscript.sh) 
    PREV_JOB=$NEXT_JOB 
done 
done 

,如果你在myscript.sh需要移動或下載多個文件或在創建交通繁忙的程序有這是有用的集羣蘭

1

這工作在bash,但思路應該是便攜。使用-terse來幫助建立一個帶有工作ID的字符串以等待;然後提交使用-hold_jid等待在以前的工作和-sync y,這樣的qsub不會返回,直到它(以及所有prereqs)已完成虛擬工作:

# example where each of three jobs just sleeps for some time: 
job_ids=$(qsub -terse -b y sleep 10) 
job_ids=job_ids,$(qsub -terse -b y sleep 20) 
job_ids=job_ids,$(qsub -terse -b y sleep 30) 
qsub -hold_jid ${job_ids} -sync y -b y echo "DONE" 
  • -terse選項使的qsub的輸出只是作業ID(如在其他的答案中提到)
  • -hold_jid選項使指定的作業ID
  • -sync y選項(由OP引用)工作等待要求的qsub不返回,直到提交作業完成
  • -b y指定該命令是不是一個腳本文件的路徑(例如,我使用sleep 30作爲命令)

有關詳細信息,請參閱man page

0

我需要更多的靈活性,所以我爲此和其他目的構建了一個Python模塊here。您可以直接將模塊作爲腳本運行(python qsub.py)進行演示。

用法:

$ git clone https://github.com/stevekm/util.git 
$ cd util 
$ python 
Python 2.7.3 (default, Mar 29 2013, 16:50:34) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import qsub 
>>> job = qsub.submit(command = 'echo foo; sleep 60', print_verbose = True) 
qsub command is: 

qsub -j y -N "python" -o :"/home/util/" -e :"/home/util/" <<E0F 
set -x 
echo foo; sleep 60 
set +x 
E0F 

>>> qsub.monitor_jobs(jobs = [job], print_verbose = True) 
Monitoring jobs for completion. Number of jobs in queue: 1 
Number of jobs in queue: 0 
No jobs remaining in the job queue 
([Job(id = 4112505, name = python, log_dir = None)], []) 

,因爲我們的系統運行什麼這就是與Python 2.7和SGE設計。唯一需要的非標準Python庫都附帶tools.pylog.py模塊和sh.py(也包括在內)

顯然不是,如果你想留純粹bash,但有用的,如果你需要等待qsub工作,然後我可以想象你的工作流正在朝着複雜性方向發展,而這種複雜性將從使用Python中受益。