2010-10-07 7 views
5

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

, например, я посылаю

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

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

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

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

ssh qstat 

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

ответ

6

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

Один из самых удобных способов управления большим количеством связанной работы в более поздних версиях крутящего момента (и с помощью механизма сетки и т. Д.) Заключается в том, чтобы запускать любые отдельные задания в виде массива заданий (см. 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[] 

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

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

6

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

1

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

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

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

#!/bin/bash 

... 
waitfor='' 

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

wait $waitfor 
... 

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