Дождитесь завершения заданий 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.