Имам скрипт за работа compile.pbs
, който работи на един процесор и компилира изходния код, за да създаде изпълним файл. След това имам 2-ри скрипт за работа jobscript.pbs
, който извиквам, използвайки 32 процесора, за да стартирам този новосъздаден изпълним файл с MPI. И двамата работят перфектно, когато ги извикам ръчно последователно, но бих искал да автоматизирам процеса, като накарам първия скрипт да извика 2-рия jobscript точно преди да приключи. Има ли начин правилно да се вложат qsub повиквания или те да бъдат извиквани последователно?
В момента се опитвам да накарам първия скрипт да извика втория скрипт точно преди да приключи, но когато се опитам, получавам странно съобщение за грешка от втория (вложен) qsub:
qsub: Bad UID for job execution MSG=ruserok failed validating masterhd/masterhd from s59-16.local
Мисля, че вторият скрипт се извиква правилно, но може би разрешенията не са същите като когато извиках оригиналния. Очевидно моето потребителско име masterhd
има право да изпълнява скриптовете за задания, защото работи добре, когато извикам скрипта за задание ръчно. Има ли начин да постигна това, което се опитвам да направя?
Ето по-подробен пример за процедурата. Първо извиквам първия работен скрипт и определям променлива с -v
:
qsub -v outpath='/home/dest_folder/' compile.pbs
Тази променлива outpath
просто указва къде да се копира новият изпълним файл и след това вторият скрипт на заданието се променя в тази изходна директория и се опитва да изпълни 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