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

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

#!/bin/bash

#SBATCH -o "outFile"".txt"
#SBATCH -e "errFile"".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.txt  exampleJob.sh outFile.txt

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

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

5 ответов


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

#!/bin/bash

touch outFile.txt errFile.txt
rm link_out.sbatch link_err.sbatch 2>/dev/null # remove links from previous runs
ln -s outFile.txt link_out.sbatch
ln -s errFile.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''.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"

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

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

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

вы можете укажите переменную среды заранее в скрипте bash:

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

или определить его непосредственно в теге как qsub разрешается:

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

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


что-то вроде этого работает для меня и Torque

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

#!/bin/bash
hostname > outFile.txt 2>errFile.txt
exit 0

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

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

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

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

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

hostname

exit 0
EOT

и вы запустить shell-скрипт такой:

bash [script_name].sh [suffix]

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