Передача параметра в скрипт slurm - PullRequest
0 голосов
/ 19 июня 2019

Я использую сценарии slurm для запуска массивов для вычислений Matlab в кластере.Каждый скрипт использует массив для циклического перебора параметра matlab.

1) Можно ли создать сценарий оболочки для зацикливания другой переменной?
2) Можно ли передать переменные в сценарий slurm?

Например, мои файлы slurm в настоящее время выглядяткак

#!/bin/bash
#SBATCH --array=1-128
...
matlab -nodesktop r "frame=[${SLURM_ARRAY_TASK_ID}]; filename=['Person24']; myfunction(frame, filename);";

Мне часто нужно запускать этот массив для обработки ряда различных файлов.Это означает, что я отправлю задание (sbatch exampleScript.slurm), отредактирую файл, обновлю «Person24» до «Person25», а затем повторно отправлю задание.Это довольно неэффективно, когда мне нужно обработать большое количество файлов.

Могу ли я создать сценарий оболочки, который бы передавал переменную сценарию slurm?Например, что-то вроде этого:

Shell Script (myshell.sh)

#!/bin/bash
for ((FNUM=24; FNUM<=30; FNUM+=1));
do
     sbatch myscript.slurm  >> SOMEHOW PASS ${FNUM} HERE (?)
done 

Slurm script (myscript.slurm)

#!/bin/bash
#SBATCH --array=1-128
...
matlab -nodesktop -nodisplay r "frame=[${SLURM_ARRAY_TASK_ID}]; filename=[${FNUM}]; myfunction(frame, filename);";

, где я мог бы эффективно отправить все задания, используя что-то вроде sbatch myshell.sh

Спасибо!

1 Ответ

1 голос
/ 19 июня 2019

Чтобы избежать возможных конфликтов имен с переменными оболочки и окружения, рекомендуется всегда использовать строчные или смешанные переменные в ваших скриптах Bash.

Вы были почти там. Вам просто нужно передать переменную в качестве аргумента во второй скрипт, а затем забрать его там, основываясь на позиционных параметрах. В этом случае, похоже, вы передаете только один аргумент, поэтому $1 можно использовать. В других случаях с несколькими параметрами фиксированного числа вы также можете использовать $2, $3 и т. Д. С переменным числом аргументов «$ @» будет более подходящим.

Shell Script (myshell.sh)

#!/bin/bash
for ((fnum=24; fnum<=30; fnum+=1))
do
     sbatch myscript.slurm "$fnum"
done 

Сценарий слёрма (myscript.slurm)

#!/bin/bash
#SBATCH --array=1-128

fnum=$1

...
matlab -nodesktop -nodisplay r "frame=[${slurm_array_task_ID}]; filename=[${fnum}]; myfunction(frame, filename);";

Для обработки различных условий ожидания это может работать:

A=$(sbatch --parsable a.slurm)

case $? in
    9|64|130|131|137|140)
        echo "some sort of timeout occurred"
        B=$(sbatch --parsable --dependency=afternotok:$A a.slurm)
        ;;
    *)
        echo "some other exit condition occurred"
        ;;
esac

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...