2012-11-29 178 views
-1

我想編寫一個腳本來執行下面列出的步驟。如果有人可以提供簡單的例子來說明如何使用腳本修改文件和搜索文件夾(不一定解決我的問題),我將不勝感激。完成作業後提交批作業

  1. currentDirectory使用myJobShellFile.shMyJob,轉到完成後提交工作MyJob到隊列

  2. currentDirectory/myJobDataFolder。 在myJobDataFolder,有文件夾

    myJobData.0000myJobData.0001myJobData.0002myJobData.0003

    我想找到所有列出的文件夾的最大數量maxIteration。這將是maxIteration=0003。\

  3. 在文件myJobShellFile.sh,在最後一行說

    mpiexec ./main input myJobDataFolder

    我想這行追加到

    「mpiexec的./main輸入myJobDataFolder 0003 '

  4. 我要提交MyJob到排隊while maxIteration < 10

  5. 後的MyJob完成後,找到新的maxIterationmyJobShellFile.sh,並轉至步驟更改此號碼4.

我認爲人們編寫Python腳本通常要做到這一點的東西,但我有一個很難找到如何。我可能不知道這個程序的正確術語。我也知道腳本會根據排隊系統而略有不同,但任何幫助將不勝感激。

+0

我認爲,對於作業控制,更多的人編寫bash腳本比python腳本。你在使用什麼操作系統?你知道如何寫下列哪一項? :python,bash,awk,perl –

+0

@ jwpat7,我正在使用提交作業到超級計算資源。操作系統是Linux RedHat。我不知道python,awk或perl。我知道bash的基本知識,如cd,find等。我知道C++和Matlab,但我認爲這對我沒有幫助。 如果我能得到如何使用腳本編輯文件和搜索文件的一般想法,我想我可以找出其餘的。謝謝。 – namu

回答

1

挺你的問題的幾個方面都不清楚,比如,「使用myJobShellFile.sh到闕提交工作MyJob在currentDirectory所」,「追加此行 ‘mpiexec的./main輸入myJobDataFolder 0003’」的含義,工作完成時的檢測方式,myJobShellFile.sh的相關部分以及其他一些細節。如果您可以列出您在作業提交的每次迭代中使用的特定shell命令,那麼您可以發佈一個更好的問題,使用bash標記而不是python。

在下面的腳本中,我把###放在任何一行的末尾,我猜測你在說什麼。以###結尾的行可能與您實際執行的任何操作無關,也可能是僞代碼。無論如何,總的想法是,腳本應該做的事,你在你的項目中列出的東西1〜5這個腳本假定您已經修改myJobShellFile.sh
mpiexec ./main input $1 $2
而不是
mpiexec ./main input
因爲它更簡單使用參數來修改您告訴mpiexec的內容,而不是修改shell腳本。另外,在我看來,您希望在提交下一個作業之前增加maxIter,而不是之後。如果是這樣,請從t=$((1$maxIter+1)); maxIter=${t#1}行刪除#。請注意,請參閱${var#txt}表單的man bash re擴展的「參數擴展」部分,以及$((expression))格式的「算術擴展」部分。 1$maxIter和類似的表格用於將0018(這不是有效的bash數字,因爲8不是八進制數字)這樣的文本更改爲10018

#!/bin/sh 
./myJobShellFile.sh MyJob ### 
maxIter=0 
while true; do 
    waitforjobcompletion  ### 
    cd ./myJobDataFolder 
    maxFile= $(ls myJobData* | tail -1) 
    maxIter= ${maxFile#myJobData.} #Get max extension 
    # If you want to increment maxIter, uncomment next line 
    # t=$((1$maxIter+1)); maxIter=${t#1} 
    cd .. 
    if [[ 1$maxIter -lt 11000 ]] ; then 
     ./myJobShellFile.sh MyJobDataFolder $maxIter 
    else 
     break 
    fi 
done 

注:(1)具有比1000次小的提交運行測試,取代11000 10000 + N; (2)在編寫上述腳本時,我假定輸出目錄中不時會出現未知的輸出文件數目。如果每次運行只顯示一個輸出文件,而您只想爲值0000,0001,0002,0999,1000每個值執行一次運行,則使用類似以下的腳本。 (對於具有超過1000更小數目的測試,代替1000用例如()0020的前導零在這些號碼告訴bash中與前導零填充生成的數字。)

#!/bin/sh 
for iter in {0000..1000}; do 
    ./myJobShellFile.sh MyJobDataFolder $iter 
    waitforjobcompletion  ### 
done 

(3)如果系統有一個在超級計算資源上等待作業完成時休眠的命令,在上述腳本中使用該命令代替waitforjobcompletion是合理的。否則,如果系統有一個命令jobisrunning返回true,如果一個作業仍在運行,具有類似如下的替代waitforjobcompletion

while jobisrunning ; do sleep 15; done 

這將運行jobisrunning命令;如果它返回true,那麼shell將會休眠15秒,然後重新測試。這裏是說明等待文件出現,然後就走開一個例子:

while [ ! -f abc ]; do sleep 3; echo no abc; done 
while ls abc >/dev/null 2>&1; do sleep 3; echo an abc; done 

第二行的測試可能是[ -f abc ]代替;我展示了一個更長的示例來說明如何通過將它們路由到/ dev/null來抑制輸出和錯誤消息。 (4)要顛倒陳述測試的意義,請將while替換爲until。例如,while [ ! -f abc ]; ...相當於until [ -f abc ]; ...

+0

謝謝!這是我正在尋找的內容。我想我應該能夠弄清楚其餘的。另外,我意識到'while循環'會一直在後臺運行,所以我應該暫停一下,以便每隔X分鐘檢查一次。 – namu

+0

'waitforjobcompletion'是會阻止while循環直到作業完成的事情。你如何檢查工作完成? –

+0

排隊系統具有命令 '-l depends = JOBID' 這是完成另一個作業時的依賴關係。 'JOBID'是必須首先完成的作業的JOBID。我應該能夠編寫一個基於隊列中作業「MyJob」名稱的腳本,它可以使用排隊系統提供的命令來檢索「JOBID」。 – namu