2012-12-13 40 views
10

Mam ponad 200 zadań, które muszę przesłać do klastra i sge. Podzielę je na dwa pytania. Jedno z pytań ma maszynę, której nie chcę przesyłać. Jak mogę wykluczyć ten komputer? Jedyną rzeczą, którą znalazłem, które mogą być pomocne jest (zakładając trzy ważne węzły dostępne dla Q1 i wszystkie dostępne węzły są ważne dla Q2):z wyłączeniem węzłów z polecenia qsub pod sge

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

Odpowiedz

-1

Jest ładny obejście tego.

Generowanie prosty plik bash:

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

przesłaniu tego zadania do węzła, który chcesz wykluczyć, aż w pełni zajmują go.

Wuala, twój węzeł jest wykluczony.

+0

To jest hack, ale jedyne rozwiązanie, które działa dla mnie (+1). Próbowałem kilkunastu wariantów qsub, ale albo nie powodują one różnicy, albo powodują błąd ... – DaveFar

2

Najlepszym sposobem, jaki znalazłem, jest skonfigurowanie zasobu niestandardowego dla węzłów, na których chcesz zezwolić na wykonanie, a następnie wymaganie tego zasobu podczas przesyłania zadania.

W programie qmon przejdź do konfiguracji "złożonej" i dodaj nowy atrybut. Ustaw nazwę na coś takiego jak "my_allowed" i skrót do typu "m_a", typ do BOOL, relacja do ==, żądanie do Yes, consumable do No i "Add" to. Zatwierdź zmiany w złożonych konfiguracjach.

Następny krok jest prawdopodobnie łatwiejszy do wykonania z wiersza poleceń, ale możesz to zrobić również w programie qmon. Musisz dodać materiały eksploatacyjne do każdego hosta, na którym chcesz zezwolić na pracę. W programie qmon można przejść do konfiguracji hosta, wybrać hosta wykonywania i otworzyć kolejno każdy z hostów, klikając kartę Materiały eksploatacyjne/naprawione atrybuty i dodając nowy, właśnie skonfigurowany, parametr "True" jako wartość. Z poziomu wiersza poleceń możesz uzyskać listę hostów wykonawczych z "qconf -sel". Ta lista jest odpowiednia do przekazania do pętli i wyszukania hostów, których nie chcesz uwzględnić. Zrobić coś takiego:

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 

To pozwala programowo edytować hosta (zwykle nie dopuszcza qconf jak chce uruchomić edytor dla Ciebie). Czyni to poprzez ustawienie edytora na "ed" (będziesz musiał upewnić się, że edytor ed jest zainstalowany ... spróbuj go najpierw uruchomić ręcznie ... wpisz "q", aby wyjść). ed pobiera listę poleceń edycji na stdin, więc dajemy trzy polecenia. Pierwszy edytuje wiersz z wartościami complex_values, aby uwzględnić wartość my_test. Drugi wypisuje plik tymczasowy, a trzeci kończy ed.

Gdy już to zrobisz, prześlij swoje miejsca pracy z opcją granicznej, która wymaga nowego kompleksu:

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

Opcja -l określa limit i tym my_test = True mówi zadanie można uruchomić tylko na hosty, które mają kompleks my_test z wartością True. Ponieważ kompleks nie jest zużywający się, nadal może wykonywać dowolną liczbę zadań na każdym hoście, tak jak chce (do limitu czasu na gniazda dla hostów), ale pozwoli uniknąć hostów, które nie mają ustawionego kompleksu my_test True .

15

Zakładając, że nie chcesz go uruchamiać, nazywa się n4, następnie powinno działać następujące dodanie do skryptu.

#$ -l h=!n4 
+2

Otrzymuję "qsub: submit error (Nieznany typ zasobu Resource_List.h)" – dranxo

+0

Dzięki.Jak możesz to zrobić na dwa hosty? '# $ -l h =! n4 h! = n5' lub' # $ -l h! = n4, n5' nie działają – Arman

+0

h =! h4 &! h5 lub h =! (h4 | h5) powinny to zrobić. –