Как заставить sbatch ждать, пока не будет запущено последнее отправленное задание при отправке нескольких заданий? - PullRequest
0 голосов
/ 10 мая 2019

Я использую числовую модель, параметры которой находятся в файле «parameter.input». Я использую sbatch для отправки нескольких итераций модели, каждый раз меняя один параметр в файле параметров. Вот цикл, который я использую:

#!/bin/bash -l
for a in {01..30}
do
  sed -i "s/control_[0-9][0-9]/control_${a}/g" parameter.input
  sbatch --time=21-00:00:00 run_model.sh
  sleep 60
done

Строка sed изменяет параметр в файле параметров. Файл run_model.sh запускает модель.

Проблема: в зависимости от доступных ресурсов, задание может быть запущено немедленно или отложено на несколько часов. В моем цикле по умолчанию, если 60 секунд не достаточно для поиска ресурсов для выполнения задания n , файл параметров будет изменен, пока задание n находится в состоянии ожидания, то есть задание n будет работать с неверными параметрами. (и я не могу дождаться завершения задания n перед отправкой задания n + 1 , потому что для выполнения каждого задания требуется несколько дней)

Как заставить пакет дождаться отправки задания n + 1 , пока не будет запущено задание n ?

Я не уверен, как создать цикл until, который бы захватывал статус задания n и ждал, пока он не изменится на «выполняется», перед отправкой задания n + 1, Я экспериментировал с несколькими вещами, но на сервере, на котором я работаю, работают еще 150 человек, и я боюсь, что слишком много экспериментов может создать некоторые проблемы ...

1 Ответ

0 голосов
/ 10 мая 2019

Используйте следующую команду, чтобы получить идентификатор последней отправленной работы и ее статус, и подождите, пока она больше не будет ждать начала следующей работы:

sentence=$(sbatch --time=21-00:00:00 run_model.sh) # get the output from sbatch
stringarray=($sentence)                            # separate the output in words
jobid=(${stringarray[3]})                          # isolate the job ID
sentence="$(squeue -j $jobid)"            # read job's slurm status
stringarray=($sentence) 
jobstatus=(${stringarray[12]})            # isolate the status of job number jobid

Убедитесь, что статус задания «запущен», перед отправкой следующего задания с помощью:

if [ "$jobstatus" = "R" ];then
  # insert here relevant code to run next job
fi

Вы можете вставить этот последний фрагмент в цикл until, который проверяет состояние задания каждые несколько секунд.

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