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