Der beste Weg, den ich gefunden habe, ist eine benutzerdefinierte Ressource auf den Knoten einzurichten, für die Sie die Ausführung zulassen möchten, und dann diese Ressource benötigen, wenn Sie den Auftrag senden.
In qmon, gehen Sie zur "komplexen" Konfiguration und fügen Sie ein neues Attribut hinzu. Setzen Sie den Namen auf etwas wie "my_allowed" und die Verknüpfung zu etwas wie "m_a", den Typ zu BOOL, die Beziehung zu ==, anforderbar zu Ja, Verbrauchsmaterial zu Nein und "Hinzufügen". Übernehmen Sie Ihre Änderungen an den komplexen Konfigurationen.
Der nächste Schritt ist wahrscheinlich einfacher über die Befehlszeile auszuführen, aber Sie können es auch in qmon tun. Sie müssen Ihr Verbrauchsmaterial jedem Host hinzufügen, auf dem der Job ausgeführt werden soll. In qmon können Sie zur Hostkonfiguration wechseln, den Ausführungshost auswählen und jeden Host der Reihe nach öffnen, indem Sie auf die Registerkarte Verbrauchsmaterialien/feste Attribute klicken und den oben konfigurierten neuen Komplex mit "True" als Wert hinzufügen. Über die Befehlszeile können Sie eine Liste Ihrer Ausführungshosts mit "qconf -sel" abrufen. Diese Liste eignet sich zum Übergeben an eine Schleife und zum Auskreuzen der Hosts, die nicht enthalten sein sollen. Tun Sie etwas wie folgt aus:
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
Auf diese Weise können Sie programmatisch den Host bearbeiten (normalerweise nicht von qconf erlaubt, wie es will Editor für Sie starten). Dazu müssen Sie den Editor auf "ed" setzen (Sie müssen sicherstellen, dass der Ed-Editor installiert ist ... versuchen Sie es zuerst mit der Hand auszuführen ... geben Sie "q" ein, um auszusteigen). ed nimmt die Liste der Editierbefehle auf seiner stdin, also geben wir drei Befehle. Der erste bearbeitet die Zeile mit den complex_values, um den Wert my_test einzubeziehen. Die zweite schreibt die temporäre Datei aus und die dritte beendet ed.
Sobald Sie dies getan haben, Ihre Aufträge mit einem Limit Option einreichen, die Ihren neuen Komplex erfordert:
qsub -q whatever -l my_test=True my_prog.sh
Die Option -l setzt eine Grenze und die my_test = True sagt der Job nur auf laufen Hosts, die den Komplex my_test mit dem Wert True aufweisen. Da der Komplex nicht konsumierbar ist, kann er immer noch so viele Jobs auf jedem Host ausführen, wie er möchte (bis zum Slot-Limit für die Hosts), aber er vermeidet Hosts, bei denen der my_test-Komplex nicht auf True gesetzt ist .
Dies ist ein Hack, aber die einzige Lösung, die für mich funktioniert (+1). Ich versuchte ein Dutzend qsub-Varianten, aber sie machen entweder keinen Unterschied oder führen zu einem Fehler .... – DaveFar