it-roy-ru.com

Передать аргументы командной строки через sbatch

Предположим, у меня есть следующий простой bash-скрипт, который я хочу отправить на пакетный сервер через SLURM:

#!/bin/bash

#SBATCH -o "outFile"$1".txt"
#SBATCH -e "errFile"$1".txt"

hostname

exit 0

В этом сценарии я просто хочу записать вывод hostname в текстовый файл, полное имя которого я контролирую из командной строки, например так:

login-2:jobs$ sbatch -D `pwd` exampleJob.sh 1
Submitted batch job 203775

К сожалению, кажется, что мой последний аргумент командной строки (1) не анализируется через sbatch, поскольку созданные файлы не имеют искомого суффикса, а строка «$ 1» интерпретируется буквально:

login-2:jobs$ ls
errFile$1.txt  exampleJob.sh outFile$1.txt

Я искал места в ТАК и в других местах , но мне не повезло. По сути, я искал эквивалент переключателя -v утилиты qsub в кластерах с поддержкой Torque.

Edit: Как уже упоминалось в основной ветке комментариев, я решил свою проблему трудным путем: вместо того, чтобы иметь один единственный сценарий, который будет несколько раз передаваться на пакетный сервер, каждый с разными аргументами командной строки, я создал " главный сценарий ", который просто отображал и перенаправлял одно и то же содержимое в разные сценарии, причем содержимое каждого изменялось с помощью переданного параметра командной строки. Затем я отправил все это на свой пакетный сервер через sbatch. Однако это не отвечает на первоначальный вопрос, поэтому я не решаюсь добавить его в качестве ответа на мой вопрос или пометить этот вопрос как решенный.

17
Jason

Строки, начинающиеся с #SBATCH, не интерпретируются bash, а заменяются кодом на sbatch . Параметры sbatch не поддерживают переменные $ 1 (только% j и некоторые другие, замена $ 1 на% 1 не будет работать) .Если у вас нет разных процессов sbatch, работающих параллельно, вы можете попробовать

#!/bin/bash

touch outFile${1}.txt errFile${1}.txt
rm link_out.sbatch link_err.sbatch 2>/dev/null # remove links from previous runs
ln -s outFile${1}.txt link_out.sbatch
ln -s errFile${1}.txt link_err.sbatch

#SBATCH -o link_out.sbatch
#SBATCH -e link_err.sbatch

hostname
# I do not know about the background processing of sbatch, are the jobs still running
# at this point? When they are, you can not delete the temporary symlinks yet.

exit 0

Альтернатива: Как вы сказали в комментарии, вы можете создать мастерскрипт . Этот скрипт может содержать такие строки, как

cat  exampleJob.sh.template | sed -e 's/File.txt/File'$1'.txt/' > exampleJob.sh
# I do not know, is the following needed with sbatch?
chmod +x exampleJob.sh

В вашем шаблоне строки #SBATCH выглядят так

#SBATCH -o "outFile.txt"
#SBATCH -e "errFile.txt"
2
Walter A

Если вы передаете свои команды через командную строку, вы фактически можете обойти проблему невозможности передачи аргументов командной строки в пакетном скрипте. Так, например, в командной строке: 

var1="my_error_file.txt"
var2="my_output_file.txt"
sbatch --error=$var1 --output=$var2 batch_script.sh
10
irritable_phd_syndrom

Я подумал, что мог бы предложить некоторую информацию, потому что я также искал замену опции -v в qsub, которая для sbatch может быть выполнена с помощью опции --export. Я нашел Хороший сайт здесь , который показывает список преобразований из Torque в Slurm, и это сделало переход намного более плавным. Я еще не проверял, что это конкретно работает, но я обновлю ответ соответствующим образом, если он должен быть изменен.

Вы можете заранее указать переменную окружения в вашем bash-скрипте:

$ var_name='1'
$ sbatch -D `pwd` exampleJob.sh --export=var_name

Или определите его непосредственно в команде sbatch, как это разрешено qsub:

$ sbatch -D `pwd` exampleJob.sh --export=var_name='1'

Работает ли это в препроцессорах #exampleJob.sh - это тоже другой вопрос, но я предполагаю, что он должен обеспечивать ту же функциональность, что и Torque.

7
MasterHD

Использование обертки более удобно. Я нашел это решение от эта тема .

В основном проблема заключается в том, что директивы SBATCH рассматриваются командной оболочкой как комментарии, и поэтому в них нельзя использовать переданные аргументы. Вместо этого вы можете использовать здесь документ для подачи в ваш bash-скрипт после того, как аргументы установлены соответственно.

В случае вашего вопроса вы можете заменить файл сценария Shell следующим:

#!/bin/bash
sbatch <<EOT
#!/bin/bash

#SBATCH -o "outFile"$1".txt"
#SBATCH -e "errFile"$1".txt"

hostname

exit 0
EOT

И вы запускаете скрипт Shell следующим образом:

bash [script_name].sh [suffix]

И результаты будут сохранены в outFile [суффикс] .txt и errFile [суффикс] .txt

2
PouyaB

Нечто подобное работает для меня и Torque

echo "$(pwd)/slurm.qsub 1" | qsub -S /bin/bash -N Slurm-TEST
slurm.qsub:

#!/bin/bash
hostname > outFile${1}.txt 2>errFile${1}.txt
exit 0
1
user3665696