Дождитесь завершения заданий qsub.

У меня есть пакет script, который запускает несколько заданий qsub, и я хочу ловушку, когда они все завершены.

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

Я хочу, чтобы мой script подождал, когда все задания будут завершены, и сделайте что-нибудь после этого. Я не хочу использовать функцию сна, например. чтобы проверить, были ли созданы определенные файлы через каждые 30 с, поскольку это утечка ресурсов.

Я считаю, что Torque может иметь некоторые параметры, но я запускаю SGE.

Любые идеи о том, как я могу реализовать это, пожалуйста?

Спасибо Постскриптум Я нашел другую нить Ссылка

у которого был ответ

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

но я не уверен, как использовать его без опроса по некоторому значению. Может ли использоваться ловушка bash, но как бы я с qsub?

Ответ 1

Запустите задания qsub, используя параметр -N, чтобы дать им произвольные имена (job1, job2 и т.д.):

qsub -N job1 -cwd ./job1_script
qsub -N job2 -cwd ./job2_script
qsub -N job3 -cwd ./job3_script

Запустите script и скажите ему дождаться завершения заданий с именем job1, job2 и job3 до его запуска:

qsub -hold_jid job1,job2,job3 -cwd ./results_script

Ответ 2

qsub -hold_jid job1,job2,job3 -cwd ./myscript

Ответ 3

Другая альтернатива (из здесь) выглядит следующим образом:

FIRST=$(qsub job1.pbs)
echo $FIRST
SECOND=$(qsub -W depend=afterany:$FIRST job2.pbs)
echo $SECOND
THIRD=$(qsub -W depend=afterany:$SECOND job3.pbs)
echo $THIRD

Понимание заключается в том, что qsub возвращает jobid, и это обычно сбрасывается на стандартный вывод. Вместо этого запишите его в переменной ($FIRST, $SECOND, $THIRD) и используйте флаг -W depend=afterany:[JOBIDs], когда вы ставите в очередь свои задания для управления структурой зависимостей, когда они отложены.

Ответ 4

Если у вас есть 150 файлов, которые вы хотите обработать, и сможете запускать только 15 каждый раз, в то время как другие находятся в очереди в очереди, вы можете установить что-то вроде этого.

# split my list files in a junk of small list having 10 file each
awk 'NR%10==1 {x="F"++i;}{ print >  "list_part"x".txt" }'  list.txt

qsub все задания таким образом, чтобы первый из каждого list_part *.txt удерживал второй... второй удерживал третий... и т.д.

for list in $( ls list_part*.txt ) ; do
    PREV_JOB=$(qsub start.sh) # create a dummy script start.sh just for starting
 for file in  $(cat $list )  ; do
   NEXT_JOB=$(qsub -v file=$file  -W depend=afterany:$PREV_JOB  myscript.sh )
   PREV_JOB=$NEXT_JOB
 done
done

Это полезно, если у вас есть в myscript.sh процедура, которая требует перемещения или загрузки многих файлов или создания интенсивного трафика в cluster-lan

Ответ 5

Это работает в bash, но идеи должны быть переносимыми. Используйте -terse, чтобы упростить создание строки с идентификаторами работы для ожидания; затем отправьте фиктивное задание, которое использует -hold_jid для ожидания предыдущих заданий и -sync y, чтобы qsub не возвращался до тех пор, пока он (и, следовательно, все предварительные условия) не завершится:

# example where each of three jobs just sleeps for some time:
job_ids=$(qsub -terse -b y sleep 10)
job_ids=job_ids,$(qsub -terse -b y sleep 20)
job_ids=job_ids,$(qsub -terse -b y sleep 30)
qsub -hold_jid ${job_ids} -sync y -b y echo "DONE"  
  • -terse опция делает вывод qsub просто идентификатором задания
  • -hold_jid опция (как упоминается в других ответах) заставляет работу ждать на указанных идентификаторах работы
  • -sync y (ссылается на OP) просит qsub не возвращаться до завершения выполненного задания.
  • -b y указывает, что команда не путь к файлу script (например, я использую sleep 30 в качестве команды)

Подробнее см. справочная страница.

Ответ 6

Если все задания имеют общий шаблон в имени, вы можете указать этот шаблон при отправке заданий. https://linux.die.net/man/1/sge_types показывает, какие шаблоны вы можете использовать. Пример:

-hold_jid "job_name_pattern*"

Ответ 7

Мне нужна была большая гибкость, поэтому я построил модуль Python для этого и других целей здесь. Вы можете запустить модуль непосредственно как script (python qsub.py) для демонстрации.

Использование:

$ git clone https://github.com/stevekm/util.git
$ cd util
$ python
Python 2.7.3 (default, Mar 29 2013, 16:50:34)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import qsub
>>> job = qsub.submit(command = 'echo foo; sleep 60', print_verbose = True)
qsub command is:

qsub -j y -N "python" -o :"/home/util/" -e :"/home/util/" <<E0F
set -x
echo foo; sleep 60
set +x
E0F

>>> qsub.monitor_jobs(jobs = [job], print_verbose = True)
Monitoring jobs for completion. Number of jobs in queue: 1
Number of jobs in queue: 0
No jobs remaining in the job queue
([Job(id = 4112505, name = python, log_dir = None)], [])

Разработан с Python 2.7 и SGE, так как это то, что наша система работает. Единственными нестандартными библиотеками Python являются включенные модули tools.py и log.py, а sh.py (также включены)

Очевидно, что это не так полезно, если вы хотите остаться чисто в bash, но если вам нужно ждать на qsub заданиях, я бы предположил, что ваш рабочий процесс приближается к сложности, которая выиграет от использования Python.