Как автоматически запустить скрипт Bash, когда мои задания QSUB закончены на сервере?
-
28-09-2019 - |
Вопрос
Я хотел бы запустить скрипт, когда все работы, которые я отправил на сервер, выполнены.
Например, я отправляю
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
...
Если вы запустите этот скрипт в фоновом режиме, он не будет беспокоить вас и все, что приходит после ждать линия будет работать, когда ваши рабочие места закончится.