Как автоматически запустить скрипт Bash, когда мои задания QSUB закончены на сервере?

StackOverflow https://stackoverflow.com/questions/3886168

Вопрос

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

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

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

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

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

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

ssh qstat

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

Это было полезно?

Решение

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

Один очень удобный способ управлять большим количеством смежных заданий в более поздних версиях крутящего момента (и с помощью сетки двигателя, а другие) - запускать любые отдельные задания в качестве массива задания (CF. http://docs.adaptiveComputing.com/torque/4-1-4/content/topics/commands/qsub.htm#-t.). Это требует отображения индивидуального запуска к числам как-то, что может быть или не может быть удобным; Но если вы можете сделать это для своей работы, он значительно упрощает управление рабочие места; Вы можете QSub их все в одной строке, вы можете QDEL или qold их сразу (пока не имею возможность справиться с работой индивидуально).

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

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

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

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

Другие советы

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

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

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

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

#!/bin/bash

...
waitfor=''

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

wait $waitfor
...

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top