Сценарий PBS -o файл в нескольких местах
Иногда, когда я запускаю задания в кластере PBS, мне бы очень хотелось, чтобы журнал заданий (-o файл) находился в двух местах. Один в $PBS_O_WORKDIR
для того, чтобы держать все вместе и один ${HOME}/jobOuts/
для greping/awking/ и т.д...
Выполнение теста из командной строки работает с tee
:
echo "hello" | qsub -o `tee $HOME/out1.o $HOME/out2.o $HOME/out3.o`
Но как только я пытаюсь вставить это в свой сценарий PBS, он не работает, если я помещаю его в сценарий PBS и qsub
####Parameterized PBS Script ####
#PBS -S /bin/bash
#PBS -l nodes=1
#PBS -l walltime=0:01:00
#PBS -j oe
#PBS -o `tee TEE_TEST.o TEE_TEST.${PBS_JOBID}.o`
#PBS -M me@email.com
#PBS -m abe
#PBS -V
cd $PBS_O_WORKDIR
echo `date`
Вот qsub и ошибка:
qsub TEST.pbs
qsub: directive error: -o `tee TEE_TEST.o TEE_TEST.${PBS_JOBID}.o`
Я попробовал несколько других вещей ниже - ничего не получалось.
Одна -o строка (запятая, точка с запятой и пробел):
#PBS -o ${PBS_JOBNAME}.${PBS_JOBID}.o,${HOME}/jobOuts/${PBS_JOBNAME}.${PBS_JOBID}.o
#PBS -o ${PBS_JOBNAME}.${PBS_JOBID}.o,${HOME}/jobOuts/${PBS_JOBNAME}.${PBS_JOBID}.o
#PBS -o ${PBS_JOBNAME}.${PBS_JOBID}.o ${HOME}/jobOuts/${PBS_JOBNAME}.${PBS_JOBID}.o
и две строки:
#PBS -o ${PBS_JOBNAME}.${PBS_JOBID}.o
#PBS -o ${HOME}/jobOuts/${PBS_JOBNAME}.${PBS_JOBID}.o
Линейка двух работ просто выбирает вариант 2 -o, а лайнеры не работают.
Какие-либо предложения? Является ли это возможным?
2 ответа
Я изучил справочную страницу qsub и не думаю, что есть способ указать более одного выходного файла (каждый) для стандартного вывода и стандартной ошибки. Пользуясь подсказками с этой страницы, я смог достичь чего-то похожего на ваши цели. Ваша среда PBS может быть немного другой. Кроме того, я не эксперт по Bash, поэтому могут быть более краткие методы достижения того же.
Предполагая, что вы используете настройки -o по умолчанию, в конце вашего обычного сценария работы поместите команды:
# change to the directory from which this job was submitted
cd $PBS_O_WORKDIR
# the standard output by default will be in file JOBNAME.oJOBID
# on my system, PBS_JOBID has ".machinename" at the end, which needs to be removed
filename=${PBS_JOBNAME}.o${PBS_JOBID%%.*}
echo "${PBS_O_WORKDIR}/copy.pbs $filename" | qsub
Это запустит qsub с использованием аргументов stdin, говорящих ему о запуске "copy.pbs" с аргументом имени файла, который будет скопирован. Файл copy.pbs, который я использовал:
#!/bin/bash
# change to the directory from which this job was submitted
cd $PBS_O_WORKDIR
newfile=${HOME}/jobOuts/$1
cp $1 $newfile
Это помогло мне скопировать первый стандартный вывод PBS в другой каталог. Побочным эффектом является то, что при запуске copy.pbs с qsub создаются еще два выходных файла, STDIN.e* и STDIN.o*. Я подумал, что снова использовать qsub - хорошая идея, чтобы убедиться, что первая работа закончена. Чтобы быть более безопасным, вы можете использовать "зависит от опции" с qsub, например "-W depend=afterok:$PBS_JOBID copy.pbs $filename" | qsub
, Но я не тестировал этот метод и, как я уже сказал, я не эксперт в этом.
Я очень удивлен, что ваш пример командной строки сработал. Ваша работа действительно выполнялась? Я думаю, что бег
echo "hello" | qsub -o `tee $HOME/out1.o $HOME/out2.o $HOME/out3.o`
Короткое замыкание запускает работу и на самом деле просто хватает "привет" и передает его в тройник. Я предполагаю, что кто-то, кто знает bash немного лучше, мог бы объяснить, что на самом деле здесь происходит.
Единственный способ сделать то, что вы запрашиваете, - это заставить ваш сценарий написать что-то интересное. Чтобы это работало, вам нужно, чтобы местоположения находились в сетевой файловой системе, доступной с любого возможного вычислительного узла.