Исключая узлы из команды qsub под sge

У меня есть более 200 заданий, которые мне нужно отправить в кластер sge. Я отправлю их на два вопроса. В одном из вопросов есть машина, на которую я не хочу отправлять задания. Как я могу исключить эту машину? Единственное, что я нашел, что может быть полезно, - это использование трех допустимых узлов, доступных для q1, и все доступные узлы для q2 действительны):

qsub -q [email protected] [email protected] [email protected] q2.q

Ответ 1

Есть хороший обходной путь к этому.

Создайте простой файл bash:

#!/bin/bash
sleep 6000 #replace 6000 with any long period of time that will be enough to submit your jobs

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

Вуаля, ваш узел исключен.

Ответ 2

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

#$ -l h=!n4

Ответ 3

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

В qmon перейдите в "сложную" конфигурацию и добавьте новый атрибут. Задайте имя как "my_allowed" и ярлык на что-то вроде "m_a", тип BOOL, отношение к ==, запрос на "Да", расходный материал "Нет" и "Добавить". Зафиксируйте свои изменения в сложных конфигурациях.

Следующий шаг, вероятно, проще сделать из командной строки, но вы можете сделать это и в qmon. Вам нужно добавить свои расходные материалы на каждый хост, чтобы вы могли выполнять свою работу. В qmon вы можете перейти к конфигурации хоста, выбрать хост выполнения и открыть поочередно каждый хост, щелкнув вкладку расходных материалов/фиксированных атрибутов и добавить новый комплекс, который вы только что сконфигурировали выше, с "True" в качестве значения. Из командной строки вы можете получить список хостов выполнения с помощью "qconf -sel". Этот список подходит для перехода в цикл и grepping из хоста (ов), который вы не хотите включать. Сделайте что-то вроде этого:

qconf -sel | grep -v host_to_exclude | while read host; do
    EDITOR="ed" qconf -me $h <<EOL
/complex_values/s/$/,my_test=True/
w
q
EOL
done

Это позволяет вам программно редактировать хост (обычно не разрешается qconf, так как он хочет запустить ваш редактор для вас). Он делает это, устанавливая редактор в "ed" (вам нужно убедиться, что у вас установлен редактор ed... попробуйте запустить его вручную сначала... введите "q", чтобы выйти). ed принимает список команд редактирования на нем stdin, поэтому мы даем ему три команды. Первый редактирует строку с complex_values ​​на ней, чтобы включить значение my_test. Второй выписывает временный файл, а третий - редактирует.

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

qsub -q whatever -l my_test=True my_prog.sh

Параметр -l устанавливает предел, а my_test = True говорит, что задание может выполняться только на хостах, у которых есть сложный my_test со значением True. Поскольку комплекс не расходуется, он все равно может выполнять столько заданий на каждом хосте, сколько захочет (до предела слота для хостов), но он избежит любых хостов, у которых не установлен комплекс my_test, равный True.