Сценарий 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 немного лучше, мог бы объяснить, что на самом деле здесь происходит.

Единственный способ сделать то, что вы запрашиваете, - это заставить ваш сценарий написать что-то интересное. Чтобы это работало, вам нужно, чтобы местоположения находились в сетевой файловой системе, доступной с любого возможного вычислительного узла.

Другие вопросы по тегам