我有一个在单个CPU上运行的作业compile.pbs
,并编译源代码以创建可执行文件。然后我有一个第二个作业脚本jobscript.pbs
,我用32个CPU来调用MPI运行新创建的可执行文件。当我连续手动调用它们时,它们都能很好地工作,但是我希望通过让第一个脚本在它结束之前调用第二个脚本来自动化该过程。 有没有办法正确嵌套qsub调用或连续调用它们?
目前我的尝试是让第一个脚本在它结束之前调用第二个脚本,但是当我尝试从第二个(嵌套的)qsub获取一个奇怪的错误消息时:
qsub: Bad UID for job execution MSG=ruserok failed validating masterhd/masterhd from s59-16.local
我认为正确调用了第二个脚本,但可能权限与我调用原始权限时的权限不同。显然,我的用户名masterhd
被允许运行jobscripts,因为它在我手动调用jobscript时工作正常。有没有办法完成我想要做的事情?
以下是该程序的更详细示例。首先,我调用第一个jobcript并使用-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
答案 0 :(得分: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
答案 1 :(得分:1)
您的系统可能存在在脚本中运行脚本的限制。你的第一份工作只运行5分钟,然后第二份工作需要96小时。如果在第一份工作中请求第二份工作,那将违反第一份工作的时间限制。
为什么不能将编译部分放在第二个脚本的开头?