wie man automatisch einen Bash-Skript ausgeführt, wenn meine qsub Jobs auf einem Server fertig sind?

StackOverflow https://stackoverflow.com/questions/3886168

Frage

Ich möchte ein Skript ausgeführt werden soll, wenn alle Jobs, dass ich an einen Server gesendet haben, werden durchgeführt.

zum Beispiel, ich sende

ssh server "for i in config*; do qsub ./run 1 $i; done"

Und ich bekomme eine Liste der Arbeitsplätze zurück, die gestartet wurden. Ich mag automatisch ein anderes Skript auf dem Server startet die Ausgabe von diesen Jobs zu verarbeiten, wenn alle abgeschlossen sind.

würde ich irgendwelche Ratschläge zu schätzen wissen, dass Sie mir folgende unelegant Lösung zu vermeiden helfen würde:

Wenn ich speichern jede der 1000 Job-IDs aus dem obigen Aufruf in einer separaten Datei, ich den Inhalt jeder Datei gegen die aktuelle Liste der laufenden Aufträge überprüfen konnte, das heißt Ausgang von einem Aufruf:

ssh qstat

würde ich nur noch jede halbe Stunde zu überprüfen, aber ich könnte mir vorstellen, dass es einen besseren Weg gibt.

War es hilfreich?

Lösung

Es hängt ein wenig auf, was Job-Scheduler Sie verwenden und welche Version, aber es gibt einen anderen Ansatz, der auch genommen werden kann, wenn Ihre Ergebnisse Verarbeitung kann auch auf der gleichen Schlange wie die Arbeit erledigt werden.

Eine sehr praktische Möglichkeit, aus vielen ähnlichen Jobs in neueren Versionen von Drehmoment (und mit Grid Engine und anderen) der Verwaltung ist es, die alle einzelnen Jobs als Job-Array zu starten (siehe http://docs.adaptivecomputing.com/torque/4-1- 4 / Content / Themen / Befehle / qsub.htm # -t ). Dies erfordert irgendwie die einzelnen Läufe Zahlen abbildet, die nicht bequem sind oder nicht; aber wenn Sie können es für Ihre Arbeit machen, es ist stark vereinfacht, die Arbeitsplätze zu verwalten; Sie können sie alle in einer Zeile qsub, können Sie sie alle auf einmal QDEL oder qhold (während immer noch die Fähigkeit hat, mit Arbeitsplätzen individuell zu behandeln).

Wenn Sie dies tun, dann könnten Sie eine Analyse Auftrag senden, die auf dem Array von Arbeitsplätzen eine Abhängigkeit hatte, die nur laufen würde, sobald alle Aufträge in der Anordnung waren komplett: (vgl http://docs.adaptivecomputing.com/torque/4-1-4 /Content/topics/commands/qsub.htm#dependencyExamples ). Senden des Auftrags aussehen würde:

qsub analyze.sh -W depend=afterokarray:427[]

wo analyze.sh das Skript hatte die Analyse zu tun, und 427 würden die Job-ID des Arrays von Jobs, die Sie ins Leben gerufen. (Die [] Mittel erst, nachdem alle ausgeführt werden, abgeschlossen). Die Syntax unterscheidet sich für andere Disponenten (zB SGE / OGE), aber die Ideen sind gleich.

Dieses Recht bekommen können nimmt einige tun, und schon gar Tristans Ansatz hat den Vorteil, einfach zu sein, und die Arbeit mit jedem Scheduler; sondern das Lernen Job-Arrays in dieser Situation zu verwenden, wenn Sie diese Menge kann Ihre Zeit wert sein, tun werden.

Andere Tipps

Etwas, das man betrachten könnte, wird mit jedem Job Skript berührt nur einen Dateinamen in einem speziellen Ordner wie $i.jobdone, und in Ihrem Master-Skript, können Sie einfach ls *.jobdone | wc -l zu Test für die richtige Anzahl von Arbeitsplätzen getan verwenden.

Sie können mit warten die Ausführung stoppen, bis alle Ihre Arbeiten erledigt werden. Sie können sogar Collect all Exit-Status und andere Lauf Statistik (Zeit dauerte es, zählt die Arbeitsplätze zu der Zeit getan, was auch immer), wenn Sie Zyklus um IDs für spezifische warten.

würde ich ein kleines C-Programm schreiben das Warten zu tun und zu sammeln (wenn Sie Berechtigungen zum Hochladen und ausführen ausführbare Dateien), aber man kann die bash leicht verwenden warten eingebaut für etwa die gleicher Zweck, wenn auch mit weniger Flexibilität.

Bearbeiten : kleines Beispiel

.
#!/bin/bash

...
waitfor=''

for i in tasks; do
    task &
    waitfor="$waitfor $!"
done

wait $waitfor
...

Wenn Sie das Skript im Hintergrund laufen, wird es Sie nicht stört und was kommt nach dem warten Zeile wird ausgeführt, wenn Ihre Arbeitsplätze sind vorbei.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top