У меня есть скрипт задания 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