2013-07-20 31 views
0

我有一個工作腳本compile.pbs它運行在一個CPU上並編譯源代碼來創建一個可執行文件。然後我有第二個工作腳本jobscript.pbs,我使用32個CPU調用MPI來運行新創建的可執行文件。當我連續手動調用它們時,它們都可以很好地工作,但是我希望在第一個腳本剛剛結束前調用第二個腳本來自動執行該過程。 有沒有辦法正確嵌套qsub調用或連續調用它們?扭矩嵌套/連續qsub電話

目前我的嘗試是有第一個腳本調用第二個腳本,它結束前的,但是當我嘗試,我得到從第二(嵌套)的qsub一個奇怪的錯誤消息:

qsub: Bad UID for job execution MSG=ruserok failed validating masterhd/masterhd from s59-16.local 

我認爲第二個腳本被正確調用,但是也許權限與我調用原始腳本不一樣。顯然,我的用戶名masterhd被允許運行jobscripts,因爲當我手動調用jobscript時,它工作正常。有沒有辦法完成我想要做的事情?

下面是一個更詳細的過程示例。首先我所說的第一jobscript與-v指定一個變量:

qsub -v outpath='/home/dest_folder/' compile.pbs 

outpath變量只是指定了複製新的可執行文件,然後第二jobscript變化到輸出目錄,並嘗試運行jobscript.pbs

compile.pbs:

#!/bin/bash 
#PBS -N compile 
#PBS -l walltime=0:05:00 
#PBS -j oe 
#PBS -o ocompile.txt 

#Perform compiling stuff: 
module load gcc-openmpi-1.2.7 
rm *.o 
make -f Makefile 
#Copy the executable to the destination: 
cp visct ${outpath}/visct 
#Change to the output path before calling the next jobscript: 
cd ${outpath} 
qsub jobscript 

jobscript.pbs:

#!/bin/bash 
#PBS -N run_exe 
#PBS -l nodes=32 
#PBS -l walltime=96:00:00 
#PBS -j oe 
#PBS -o results.txt 

cd $PBS_O_WORKDIR 
module load gcc-openmpi-1.2.7 
time mpiexec visct 

回答

3

也許你認爲QSUBS兩個作業提交一個劇本,但使得僅次於如果執行,而此前,無錯完成第一:

JOB1CMD="qsub -v outpath='/home/dest_folder/' compile.pbs -t" # -t for terse output 
JOB1OUT=$(eval $JOB1CMD) 
JOB1ID=${JOB1OUT%%.*} # parse to get job id, change accordingly 

JOB2CMD="qsub jobscript.pbs -W depend=afterok:$JOB1ID" 
eval $JOB2CMD 
+0

應該如何設置JOB0.walltime,即提交腳本的walltime? JOB0.walltime = JOB1.walltime + JOB2.walltime? JOB0.walltime = error_margin(JOB1.walltime + JOB2.walltime),其中1 TomRoche

1

,有你的系統裏面的腳本運行腳本的限制有可能。你的第一份工作只運行5分鐘,然後第二份工作需要96小時。如果第一份工作需要第二份工作,那將違反第一份工作的時間限制。

爲什麼不能把編譯部分放在第二個腳本的開頭?

+0

本來這不會工作,因爲我沒有」不知道如何改變PBS文件中CPU的硬編碼數量,根據我是想編譯還是編譯運行,請求1或32個CPU。但顯然我可以通過在必要時將'-l nodes = 32'傳遞給qsub調用來覆蓋PBS文件中的值。 – MasterHD