Я хочу создать уникальный каталог для каждого задания Slurm, которое я запускаю. Однако mkdir
прерывает SBATCH
команды. Например. когда я пытаюсь:
#!/bin/bash
#SBATCH blah blah other Slurm commands
mkdir /path/to/my_dir_$SLURM_JOB_ID
#SBATCH --chdir=/path/to/my_dir_$SLURM_JOB_ID
touch test.txt
...выполнение Slurm точно создает каталог в /path/to/my_dir_$SLURM_JOB_ID
, но пропускает команду --chdir
и выполняет скрипт sbatch из рабочего каталога, из которого был вызван пакет.
Есть ли способ создать уникальный каталог для вывода задания и установить там рабочий каталог в одном скрипте sbatch?
Во-первых, параметры #SBATCH
должны быть вверху файла и ссылаться на документацию
перед любыми исполняемыми командами
Таким образом, ожидается, что в этом случае --chdir
не будет соблюдаться. Обоснование проблемы заключается в том, что параметры #SBATCH
и, в частности, --chdir
используются Slurm для настройки среды, в которой начинается задание. Эта среда должна быть определена до начала задания и не может быть изменена Slurm впоследствии.
По тем же причинам переменные окружения не обрабатываются в #SBATCH
опциях; они просто игнорируются Bash, поскольку находятся в закомментированной строке, и Slurm не прилагает никаких усилий для их расширения.
Также обратите внимание, что --chdir
используется для
Установите рабочий каталог пакетного скрипта в каталог перед его выполнением.
и этот каталог должен существовать. Slurm не создаст его для вас.
Что вам нужно сделать, так это вызвать команду cd
в вашем скрипте.
#!/bin/bash
#SBATCH blah blah other Slurm commands
WORKDIR=/path/to/my_dir_$SLURM_JOB_ID
mkdir -p "$WORKDIR" && cd "$WORKDIR" || exit -1
touch test.txt
Обратите внимание на exit -1
, чтобы в случае сбоя при создании каталога ваша работа останавливалась, а не продолжалась в каталоге отправки.
В качестве примечания: всегда интересно добавить строку set -euo pipefail
в свой сценарий. Это гарантирует, что ваш скрипт остановится, если какая-либо команда в нем не сработает.
вызов
cd
кажется таким очевидным в ретроспективе. Спасибо.pipefail
также является идеальным дополнением для моего кода, поскольку получить правильное уничтожение разветвленного кода не всегда чисто. Хотел бы я снова проголосовать за это дополнение.