Torque вложено/последователно qsub извикване

Имам скрипт за работа 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

person MasterHD    schedule 20.07.2013    source източник


Отговори (2)


Можете да направите скрипт за подаване, който 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
person gzS    schedule 21.07.2013
comment
Как трябва да се зададе JOB0.walltime, т.е. walltime за подаващия скрипт? JOB0.walltime = JOB1.walltime + JOB2.walltime? JOB0.walltime = error_margin(JOB1.walltime + JOB2.walltime) , където 1 ‹ error_margin ‹ 2? нещо съвсем различно? извинения за скапаното форматиране, не виждам как да правя нови редове в коментарите :-( - person TomRoche; 16.12.2013

Възможно е във вашата система да има ограничения за изпълнение на скриптове вътре в скриптове. Първата ви задача работи само за 5 минути, а втората задача се нуждае от 96 часа. Ако второто задание е поискано в рамките на първото задание, това би нарушило срока на първото задание.

Защо не можете просто да поставите частта за компилиране в началото на втория скрипт?

person Wesley Bland    schedule 21.07.2013
comment
Първоначално това нямаше да проработи, защото не знаех как да променя твърдо кодирания брой CPU в PBS файла, за да поискам 1 или 32 CPU в зависимост от това дали искам да компилирам само или да компилирам и стартирам. Но очевидно мога да презапиша стойностите в PBS файла, като предам -l nodes=32 на извикването qsub, когато е необходимо. - person MasterHD; 23.07.2013