2013-07-20 35 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