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

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

#!/bin/bash

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

hostname

exit 0

В этом script я просто хочу написать вывод 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

Я просмотрел места в qaru.site/info/496810/... и в другом месте, но я рад Мне не повезло. По сути, я ищу эквивалент переключателя -v утилиты qsub в кластерах с поддержкой Torque.

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

Ответ 1

Строки, начинающиеся С#SBATCH, не интерпретируются bash, а заменяются кодом на sbatch. Параметры sbatch не поддерживают $1 vars (только% 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

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

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

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

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

Ответ 3

Я подумал, что хотел бы предложить некоторую информацию, потому что я также искал замену опции -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.

Ответ 4

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

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

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

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

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

hostname

exit 0
EOT

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

bash [script_name].sh [suffix]

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

Ответ 5

Что-то вроде этого работает для меня и 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