Передать аргументы командной строки через 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