задержка между запусками в bash на кластере - PullRequest
0 голосов
/ 21 апреля 2019

Я должен отправить большое количество заданий в кластере, у меня есть такой скрипт:

#!/bin/bash

for runname in bcc BNU Can CNRM GFDLG GFDLM
do
  cd given_directory/$runname
  cat another_directory | while read LINE ; do
    qsub $LINE
  done
done

В сценарии 4000 строк, т.е. 4000 заданий для каждого runename.

Количество заданий, которые могут быть отправлены в кластер, ограничено пользователем в данный момент времени.

Итак, я хочу отложить процесс между каждым запуском, в данном for-loop до один пакет, как и все запуски в каталоге bcc, готов.

Как я могу это сделать? Есть ли команда, которую я могу поставить после первого done (?), Чтобы заставить код ждать, пока не будет выполнено bcc, а затем перейти к BNU?

1 Ответ

1 голос
/ 21 апреля 2019

Один из вариантов - использовать счетчик, чтобы отслеживать, сколько заданий в данный момент отправлено, и ждать, когда будет достигнут лимит. Запрос количества заданий может быть дорогостоящей операцией для головного узла, поэтому лучше не делать это после каждого отправленного задания. Здесь это делается максимум один раз каждые SLEEP секунд.

#!/bin/bash

TARGET=4000
SLEEP=300

# Count the current jobs, pending or running
get_job_count(){
  # The grep is to remove the header, there may be a better way.
  qstat -u $USER | grep $USER | wc -l
}

# Wait until the number of job is under the limit, then submit.
submit_when_possible(){
  while [ $COUNTER -ge $TARGET ]; do
    sleep $SLEEP
    COUNTER=$(get_job_count)
  done
  qsub $1
  let "COUNTER++"
}

# Global job counter
COUNTER=$(get_job_count)

for RUNNAME in bcc BNU Can CNRM GFDLG GFDLM
do
  cd given_directory/$RUNNAME
  cat another_directory | while read JOB ; do
    submit_when_possible $JOB
  done
done

Примечание. Скрипт не тестировался, поэтому могут потребоваться небольшие исправления, но идея должна работать.

...