Моментный вложенный/последовательный вызов qsub

У меня есть скрипт задания compile.pbs, который работает на одном процессоре и компилирует исходный код для создания исполняемого файла. Затем у меня есть второй сценарий задания jobscript.pbs, который я вызываю, используя 32 ЦП для запуска этого недавно созданного исполняемого файла с MPI. Оба они отлично работают, когда я последовательно вызываю их вручную, но я хотел бы автоматизировать процесс, заставив первый скрипт вызывать второй скрипт непосредственно перед его завершением. Есть ли способ правильно вложить вызовы qsub или вызвать их последовательно?

В настоящее время моя попытка состоит в том, чтобы первый сценарий вызывал второй сценарий прямо перед его завершением, но когда я пытаюсь это сделать, я получаю странное сообщение об ошибке от второго (вложенного) qsub:

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

Я думаю, что второй скрипт вызывается правильно, но, возможно, разрешения не такие, как при вызове исходного. Очевидно, моему имени пользователя masterhd разрешено запускать сценарии заданий, потому что оно отлично работает, когда я вызываю сценарий заданий вручную. Есть ли способ выполнить то, что я пытаюсь сделать?

Вот более подробный пример процедуры. Сначала я вызываю первый jobscript и указываю переменную с -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, т. е. время стены для отправляемого скрипта? 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
Первоначально это не сработало бы, потому что я не знал, как изменить жестко закодированное количество процессоров в файле PBS, чтобы запросить 1 или 32 процессора в зависимости от того, хочу ли я компилировать только или компилировать и запускать. Но, по-видимому, я могу перезаписать значения в файле PBS, передав -l nodes=32 вызову qsub, когда это необходимо. - person MasterHD; 23.07.2013