2012-07-17 3 views
23

Ich habe ein Batch-Skript, das ein paar Qsub-Jobs startet, und ich möchte abfangen, wenn sie alle abgeschlossen sind.Warten auf Satz von Qsub-Jobs zu vervollständigen

Ich möchte nicht die Option -sync verwenden, weil ich möchte, dass sie gleichzeitig ausgeführt werden. Jeder Job hat einen anderen Satz von Befehlszeilenparametern.

Ich möchte mein Skript warten, bis alle Jobs abgeschlossen sind, und danach etwas tun. Ich möchte die Schlaffunktion nicht verwenden, z. um zu überprüfen, ob bestimmte Dateien nach jeweils 30 s generiert wurden, da dies Ressourcen entlastet.

Ich glaube, Drehmoment kann einige Optionen haben, aber ich betreibe SGE.

Irgendwelche Ideen, wie ich das bitte umsetzen könnte?

Danke Ps. habe ich einen anderen Thread Link

, die eine exzellente Spielbarkeit hatte finden

Sie warten können Ausführung zu stoppen, bis alle Arbeiten erledigt werden. Sie können sogar alle Exit-Status und andere laufende Statistiken sammeln (Zeit, Anzahl der ausgeführten Jobs, was auch immer), wenn Sie herumfahren und auf bestimmte IDs warten.

aber ich bin mir nicht sicher, wie man es verwendet, ohne auf etwas Wert abzurufen. Kann Bash Trap verwendet werden, aber wie würde ich mit Qsub?

+0

Sie haben recht, dass es einen Weg gibt, dies in TORQUE zu tun. Ich weiß nicht, ob die SGE eine Option dafür hat. – dbeer

Antwort

3
qsub -hold_jid job1,job2,job3 -cwd ./myscript 
+9

Um die Qualität Ihrer Post zu verbessern, geben Sie bitte an, warum/wie Ihre Post das Problem löst. –

24

Starten Sie Ihren qsub Jobs, die N-Option mit ihnen beliebigen Namen geben (job1, job2, usw.):

qsub -N job1 -cwd ./job1_script 
qsub -N job2 -cwd ./job2_script 
qsub -N job3 -cwd ./job3_script 

Starten Sie Ihr Skript und es sagen zu warten, bis die job1 namens Jobs , job2 und job3 fertig sind, bevor es beginnt:

qsub -hold_jid job1,job2,job3 -cwd ./results_script 
+0

Dies scheint nicht zu funktionieren, wenn die Liste der Jobs zu lang ist (ich habe 40 Jobs, der Befehl endet mit 940 Zeichen ...) – naught101

+1

Hrm .. nein, das ist nicht das Problem. PBS Pro verwendet ein anderes Format. Sie müssen '-W abhängen = afterok: [: : ...]' verwenden – naught101

1

weitere Alternative (von here) ist wie folgt:

FIRST=$(qsub job1.pbs) 
echo $FIRST 
SECOND=$(qsub -W depend=afterany:$FIRST job2.pbs) 
echo $SECOND 
THIRD=$(qsub -W depend=afterany:$SECOND job3.pbs) 
echo $THIRD 

Die Erkenntnis ist, dass Qsub die Jobid zurückgibt und dies in der Regel auf Standardausgabe ausgegeben wird. Erfassen Sie es stattdessen in einer Variablen ($FIRST, $SECOND, $THIRD) und verwenden Sie das Flag -W depend=afterany:[JOBIDs], wenn Sie Ihre Jobs in die Warteschlange stellen, um die Abhängigkeitsstruktur zu steuern, wenn sie aus der Warteschlange genommen werden.

1

Wenn Sie 150 Dateien haben, die Sie verarbeiten möchten und nur jeweils 15 ausführen können, während die anderen sich in der Warteschlange befinden, können Sie so etwas einstellen.

# split my list files in a junk of small list having 10 file each 
awk 'NR%10==1 {x="F"++i;}{ print > "list_part"x".txt" }' list.txt 

qsub alle Jobs in der Weise, dass die erste jedes list_part * .txt die zweite zu halten .... die zweite die dritte halten ..... und so weiter.

for list in $(ls list_part*.txt) ; do 
    PREV_JOB=$(qsub start.sh) # create a dummy script start.sh just for starting 
for file in $(cat $list) ; do 
    NEXT_JOB=$(qsub -v file=$file -W depend=afterany:$PREV_JOB myscript.sh) 
    PREV_JOB=$NEXT_JOB 
done 
done 

Dies ist nützlich, wenn Sie in myscript.sh einer Prozedur, die Bewegung erfordern oder viele Dateien herunterladen oder starken Verkehr im schaffen Cluster-lan

1

Die in bash funktioniert, aber die Ideen sollten tragbar sein .Verwenden Sie -terse, um den Aufbau einer Zeichenfolge mit Job-IDs zu erleichtern, auf die gewartet werden soll; dann einen Dummy-Job übergeben, -hold_jid zu warten, um auf den vorherigen Jobs verwendet und -sync y so dass qsub nicht zurück, bis sie (und damit alle prereqs) beendet hat:

# example where each of three jobs just sleeps for some time: 
job_ids=$(qsub -terse -b y sleep 10) 
job_ids=job_ids,$(qsub -terse -b y sleep 20) 
job_ids=job_ids,$(qsub -terse -b y sleep 30) 
qsub -hold_jid ${job_ids} -sync y -b y echo "DONE" 
  • -terse Option macht die Ausgabe von qsub sein nur die Job-ID
  • -hold_jid Option (wie in anderen Antworten erwähnt) macht einen Job warten auf bestimmten Job-IDs
  • -sync y Option (vom OP bezeichnet) fragt qsub nicht zurückkehren, bis der eingereichten Auftrag abgeschlossen ist
  • -b y gibt an, dass der Befehl in eine Skriptdatei nicht ein Weg ist

um weitere Informationen zu den man page anzeigen (zum Beispiel bin ich sleep 30 als Befehl).

0

Ich brauchte mehr Flexibilität, also baute ich ein Python-Modul für diese und andere Zwecke here. Sie können das Modul direkt als Skript (python qsub.py) für eine Demo ausführen.

Verbrauch:

$ git clone https://github.com/stevekm/util.git 
$ cd util 
$ python 
Python 2.7.3 (default, Mar 29 2013, 16:50:34) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import qsub 
>>> job = qsub.submit(command = 'echo foo; sleep 60', print_verbose = True) 
qsub command is: 

qsub -j y -N "python" -o :"/home/util/" -e :"/home/util/" <<E0F 
set -x 
echo foo; sleep 60 
set +x 
E0F 

>>> qsub.monitor_jobs(jobs = [job], print_verbose = True) 
Monitoring jobs for completion. Number of jobs in queue: 1 
Number of jobs in queue: 0 
No jobs remaining in the job queue 
([Job(id = 4112505, name = python, log_dir = None)], []) 

Entworfen mit Python 2.7 und SGE da das ist, was unser System läuft. Die einzigen Nicht-Standard-Python-Bibliotheken erforderlich sind, die tools.py und log.py Module enthalten und sh.py

(auch im Lieferumfang enthalten)

Offensichtlich nicht als hilfreich, wenn Sie rein in bash bleiben wollen, aber wenn Sie auf qsub Jobs warten müssen dann ich Stellen Sie sich vor, dass sich Ihr Workflow in Richtung einer Komplexität entwickelt, die von der Verwendung von Python profitieren würde.

0

Wenn alle Jobs ein gemeinsames Muster im Namen haben, können Sie dieses Muster angeben, wenn Sie die Jobs senden. https://linux.die.net/man/1/sge_types zeigt Ihnen, welche Muster Sie verwenden können. Beispiel:

-hold_jid "job_name_pattern*"