Как автоматически запустить скрипт bash, когда мои задания qsub завершены на сервере? - PullRequest
5 голосов
/ 08 октября 2010

Я хотел бы запустить сценарий, когда все задания, отправленные на сервер, выполнены.

например, отправляю

ssh server "for i in config*; do qsub ./run 1 $i; done"

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

Буду признателен за любой совет, который поможет мне избежать следующего не элегантного решения:

Если я сохраню каждый из 1000 идентификаторов заданий из указанного выше вызова в отдельном файле, я смог бы сравнить содержимое каждого файла с текущим списком запущенных заданий, то есть вывести из вызова:

ssh qstat

Мне нужно будет проверять только каждые полчаса, но я думаю, что есть лучший способ.

Ответы [ 3 ]

6 голосов
/ 12 октября 2010

Это немного зависит от того, какой планировщик заданий вы используете и какую версию, но есть и другой подход, который также может быть использован, если ваша обработка результатов также может выполняться в той же очереди, что и задание.

Один очень удобный способ управления большим количеством связанных заданий в более поздних версиях крутящего момента (и с сеточным механизмом, и другими) - запуск любых отдельных заданий в виде массива заданий (см. http://docs.adaptivecomputing.com/torque/4-1-4/Content/topics/commands/qsub.htm#-t). Это требует Отображение отдельных прогонов на числа каким-то образом, что может или не может быть удобным, но если вы можете сделать это для своих заданий, это значительно упрощает управление заданиями, вы можете qsub их всех в одной строке, вы можете qdel или qhold их всех сразу (при этом имея возможность работать с заданиями индивидуально).

Если вы сделаете это, то можете отправить задание на анализ, которое зависело от массива заданий, которые будут выполняться только после завершения всех заданий в массиве: (см. http://docs.adaptivecomputing.com/torque/4-1-4/Content/topics/commands/qsub.htm#dependencyExamples). Отправка работа будет выглядеть так:

qsub analyze.sh -W depend=afterokarray:427[]

где analysis.sh имеет скрипт для анализа, а 427 будет идентификатором запущенного вами массива заданий. ([] Означает запуск только после того, как все завершено). Синтаксис отличается для других планировщиков (например, SGE / OGE), но идеи те же.

Чтобы сделать это правильно, нужно немного поработать, и, конечно, подход Тристана имеет то преимущество, что он прост и работает с любым планировщиком; но научиться использовать в этой ситуации массивы заданий, если вы будете делать это много, может стоить вашего времени.

6 голосов
/ 08 октября 2010

Что-то, что вы могли бы рассмотреть, - это чтобы каждый сценарий задания просто касался имени файла в выделенной папке, например $i.jobdone, и в своем основном сценарии вы могли бы просто использовать ls *.jobdone | wc -l для проверки правильного количества выполненных заданий.

1 голос
/ 08 октября 2010

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

Редактировать : небольшой пример.

#!/bin/bash

...
waitfor=''

for i in tasks; do
    task &
    waitfor="$waitfor $!"
done

wait $waitfor
...

Если вы запустите этот скрипт в фоновом режиме, он вас не побеспокоит, и все, что придет после строки wait беги, когда твоя работа закончится.

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