Используйте переменную Bash в сценарии SLURM sbatch
Я пытаюсь получить значение из другого файла и использовать его в сценарии отправки SLURM. Однако я получаю сообщение об ошибке, что значение не является числовым, другими словами, оно не разыменовывается.
Вот сценарий:
#!/bin/bash
# This reads out the number of procs based on the decomposeParDict
numProcs=`awk '/numberOfSubdomains/ {print $2}' ./meshModel/decomposeParDict`
echo "NumProcs = $numProcs"
#SBATCH --job-name=SnappyHexMesh
#SBATCH --output=./logs/SnappyHexMesh.log
#
#SBATCH --ntasks=`$numProcs`
#SBATCH --time=240:00
#SBATCH --mem-per-cpu=4000
#First run blockMesh
blockMesh
#Now decompose the mesh
decomposePar
#Now run snappy in parallel
mpirun -np $numProcs snappyHexMesh -parallel -overwrite
Когда я запускаю его как обычный скрипт оболочки Bash, он правильно печатает количество процедур и делает правильный mpirun
вызов. Таким образом awk
Команда правильно анализирует количество процедур, а переменная разыменовывается, как и ожидалось.
Однако, когда я отправляю это в SLURM, используя:
sbatch myScript.sh
Я получаю ошибку:
sbatch: error: Invalid numeric value "`$numProcs`" for number of tasks.
Может кто-нибудь помочь с этим?
2 ответа
Это не сработает. Что происходит, когда вы бежите
sbatch myscript.sh
заключается в том, что slurm анализирует скрипт для этих специальных строк #SBATCH, генерирует запись задания, где-то сохраняет пакетный скрипт. Пакетный скрипт выполняется только позже, когда выполняется задание.
Поэтому вам нужно немного по-другому структурировать рабочий процесс и сначала рассчитать количество необходимых вам процедур, прежде чем отправлять задание. Обратите внимание, что вы можете использовать что-то вроде
sbatch -n $numProcs myscript.sh
вам не нужно автоматически генерировать скрипт (также, mpirun должен иметь возможность автоматически получать число процедур в вашем выделении, не нужно использовать "-np").
Slurm прекращает обработку директив в первой строке исполняемого кода скрипта. Для пользователей, чьи директивы не зависят от кода, который они пытаются запустить над этими директивами, просто поместите
#SBATCH
линии вверху.
См. Другой ответ для обходного пути / решения, если, как и в случае с OP, ваши параметры sbatch зависят от команд, которые вы разместили над ними.
Пакетный сценарий может содержать параметры, которым предшествует "#SBATCH" перед любыми исполняемыми командами в сценарии. sbatch прекратит обработку дальнейших директив #SBATCH, как только в сценарии будет достигнута первая строка без комментариев, не содержащая пробелов.
Из sbatch docs , мой акцент.