2012-12-13 5 views
10

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

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

ответ

-1

Существует хорошее шунтирование к этому.

Генерировать простой Баш файл:

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

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

Wuala, ваш узел исключает.

+0

Это взлом, но единственное решение, которое работает для меня (+1). Я пробовал дюжину вариантов qsub, но они либо не имеют никакого значения, либо приводят к ошибке .... – DaveFar

2

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

В 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 ,

15

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

#$ -l h=!n4 
+2

Я получаю «qsub: submit error (Неизвестный тип ресурса Resource_List.h)» – dranxo

+0

Спасибо.Как вы можете сделать это с двумя именами хостов? '# $ -l h =! n4 h! = n5' или' # $ -l h! = n4, n5' не работает – Arman

+0

h =! h4 &! h5 или h =! (h4 | h5) должен это сделать. –