2015-04-03 24 views
0

我知道我問了同樣的問題早從這個鏈接:與不同節點上不同的輸入文件運行的可執行文件設置SGE(更新:有一些問題)

Setting SGE for running an executable with different input files on different nodes

就像我在跟帖說,我之前在SLURM系統上使用過這種類型的東西,沒有任何問題,因爲所有東西都被封裝在一個提交腳本中。但是,從上面的鏈接中的以前的問題適應,這裏是我對SGE的方法(我知道這是一個不好的做法,但我真的想不出有什麼更好的方法......)

作業被鏈接通過4個+ N腳本:run.shsubmitSerial.shwrap.shtemp.shjob{1-N}.sh

run.sh:主要作業腳本

#!/bin/bash 

...some stuffs... 
...create N directories to run N input files in parallel (like last problems) 
...generate wrap.sh and job{1-N}.sh... 

...parameters definition... 

for ((i=0; i<=M; i++)) 
do 
    ...generate submitSerial.sh... 
    sh submitSerial.sh 
    ...initialize boolean flag... 
    while flag 
    do 
     sh wrap.sh 
     ...run an executable to determine the flag status... 
    done 
done 

...some cleanup... 

submitSerial.shtemp.sh:我需要先串行執行此可執行文件, 並且希望羣集等待,直到完成以繼續執行run.sh中的下一個 過程行。由於run.sh不在集羣 環境中(即沒有Grid Engine參數),而是僅在登錄節點中僅存在 ,因此這將生成temp.sh並通過qsub立即運行串行腳本 。由於我不知道如何檢查是否完成了qsub工作,所以我不得不以愚蠢的方式來做。不知道是否有 更好的檢查方法?

#!/bin/bash 

echo "#!/bin/bash" >> $workDir/temp.sh 
echo >> $workDir/temp.sh 
echo "#$ -N serialForce" >> $workDir/temp.sh 
echo "#$ -q batch.q" >> $workDir/temp.sh 
echo "#$ -l h_rt=0:10:00" >> $workDir/temp.sh 
echo "#$ -pe orte 120" >> $workDir/temp.sh 
echo "#$ -wd /path/to/working/dir/" >> $workDir/temp.sh 
echo "#$ -j y" >> $workDir/temp.sh 
echo "#$ -S /bin/bash" >> $workDir/temp.sh 
echo "#$ -V" >> $workDir/temp.sh 
echo >> $workDir/temp.sh 
echo "mpirun -np 120 nwchem-6.5 $workDir/step0_1.nw" >> $workDir/temp.sh 

qsub $workDir/temp.sh 

while true 
do 
    qstat > $workDir/temp 
    if [ -s $workDir/temp ] 
    then 
     sleep 1 
    else 
     rm $workDir/temp 
     break 
    fi 
done 

rm $workDir/temp.sh 

wrap.shjob{1-N}.sh:這早些時候在腳本的開始 產生。這是這是我的問題最後一次的一部分,我也 用睡眠來檢查的qsub狀態以及

#!/bin/bash 

for i in {1..10} 
do 
    qsub $workDir/wd$i/job$i.sh 
done 

while true 
do 
    qstat > $workDir/temp 
    if [ -s $workDir/temp ] 
    then 
     sleep 1 
    else 
     rm $workDir/temp 
     break 
    fi 
done 

for j in {1..10} 
do 
    rm $workDir/wd$j/* 
done 

這種方法的問題是,一旦我跑run.sh,我不能這樣做在後臺並且必須單獨執行qsub's時,如果羣集已滿,則存在潛在問題。我想知道是否有像SLURM方法那樣只有一個qsub的解決方案?我只是想提交這份工作,只是等待完成,而不是讓腳本提交多個qsub作業,而不知道是否有未知的作業在中間死掉(我從來沒有想過它會死在哪裏)。

請幫我這個!非常感謝您的幫助!非常感謝您提前!

回答

0

您能否更具體和清楚您所遇到的問題。我認爲您提到的最後一個問題主要涉及wrap.shjobN.sh腳本,即使用作業陣列。

要解決您的其他問題,即如何檢查/等待工作完成,請參閱下文。

要有工作等待另一項工作來完成使用qsub選項-hold_jid。爲了將其應用於多個作業,每個作業都依賴於前一個作業,我的第一個想法就是for循環。例如:

holdid=$(echo "<some code for job 1>" | qsub -terse) 
for jobn in {1..99} 
do 
    holdid=$(echo "<some code for jobn>" | qsub -terse -hold_jid ${holdid}) 
done 

我很高興地編輯此回覆以幫助您進一步瞭解。

+0

嗨文斯,其實我也探索了一些其他的可能性,也開始了一個新的線程。我的問題可以通過使用mpirun的應用上下文功能來解決,但我仍然遇到了一些問題,這在新線程中有描述。 http://stackoverflow.com/questions/29481433/mpirun-app-option-on-grid-engine-for-mpmd-settings 我也看過SGE陣列工作作爲一種可能的解決方案,但我陳述了一些該主題中的關注也是如此。你可能也請看看那個帖子呢?非常感謝您的幫助! – KhunWasut 2015-04-06 23:45:26

+0

我實際上也在研究'qsub'的'-hold_jid'選項。它可能會解決我的問題,但我仍然擔心我正在運行的工作可能需要幾個小時或一天的時間,而且我正在處理的羣集不太可靠,並且某些「qsub」工作可能會卡住。至少當我使用SLURM時,所有東西都被包裝成一個提交,但看起來我必須做多個(可能是數千)提交才能完成同樣的問題。 – KhunWasut 2015-04-07 02:16:19

+0

另一個值得關注的問題是,當我將一份工作提交給我的集羣時,有時它會被卡在'qw'裏很久,並且不會運行(不知道是什麼原因)。如果所有內容都在一次提交中,如果發生這種情況,我可以立即刪除該作業並開始一個新的作業。然而,如果這件事發生在我第543工作的時候,那麼這個工作就會陷入自動化腳本中而不能跟蹤它,這將會非常令人沮喪,並且時間會被浪費,而不會被重新做能夠首先攔截問題。你有任何解決方案可以幫助將所有內容都包裝到一個腳本中嗎? – KhunWasut 2015-04-07 02:19:28

相關問題