come eseguire automaticamente uno script bash quando i miei lavori QSUB sono finiti su un server?

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

Domanda

vorrei eseguire uno script quando tutti i lavori che ho inviato a un server sono fatto.

Ad esempio, io mando

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

E io tornare un elenco dei processi avviati. Vorrei iniziare automaticamente un altro script sul server per elaborare l'output di questi posti di lavoro una volta che tutti sono stati completati.

Gradirei qualsiasi consiglio che mi avrebbe aiutato a evitare la seguente soluzione poco elegante:

Se salvo ciascuno dei 1000 posti di lavoro id dalla chiamata sopra in un file separato, ho potuto verificare il contenuto di ogni file con l'elenco attuale dei lavori in corso, vale a dire l'uscita da una chiamata a:

ssh qstat

vorrei solo bisogno di controllare ogni mezz'ora, ma immagino che ci sia un modo migliore.

È stato utile?

Soluzione

Dipende un po 'su quello che job scheduler che si sta utilizzando e che versione, ma c'è un altro approccio che può essere preso anche se i risultati di elaborazione può essere fatto anche sulla stessa coda come il lavoro.

Un modo molto pratico di gestire un sacco di lavoro relative a più recenti versioni di coppia (e con il motore della griglia, e altri) è quello di avviare le eventuali singoli processi come un array di lavoro (cfr http://docs.adaptivecomputing.com/torque/4-1- 4 / contenuti / argomenti / comandi / qsub.htm # -t ). Ciò richiede la mappatura delle singole corse ai numeri in qualche modo, che può o non può essere conveniente; ma se si può fare per i lavori, non semplificare notevolmente la gestione dei posti di lavoro; tutti si può QSUB in una linea, è possibile qdel o tutti qhold in una volta (pur avendo la capacità di affrontare con posti di lavoro individuale).

Se si fa questo, allora si potrebbe presentare un lavoro di analisi che aveva una dipendenza sulla matrice di posti di lavoro che sarebbe in una sola volta tutti i posti di lavoro nella matrice erano completi: (cfr http://docs.adaptivecomputing.com/torque/4-1-4 /Content/topics/commands/qsub.htm#dependencyExamples ). Invio il lavoro sarà simile:

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

dove analyze.sh avuto lo script per fare l'analisi, e 427 sarebbero l'ID del processo della matrice di posti di lavoro è stato lanciato. (I [] significa solo correre dopo tutto sono stati completati). Differisce sintassi degli schedulatori (ad esempio, SGE / OGE) ma le idee sono uguali.

Come tale diritto può richiedere un po 'facendo, e certamente l'approccio di Tristan ha il vantaggio di essere semplice, e lavorare con qualsiasi scheduler; ma imparare a usare gli array di posti di lavoro in questa situazione, se vi ritroverete a fare un sacco di questo può essere utile il vostro tempo.

Altri suggerimenti

Qualcosa si potrebbe considerare sta avendo ogni script lavoro solo toccare un nome di file in una cartella dedicata come $i.jobdone, e nello script maestro, si può semplicemente utilizzare ls *.jobdone | wc -l al test per il giusto numero di posti di lavoro fatto.

È possibile utilizzare wait per interrompere l'esecuzione fino a quando tutti i lavori sono fatti. È anche possibile raccogliere tutti gli stati di uscita e altre statistiche in esecuzione (tempo impiegato, conta di posti di lavoro fatto, al momento, a prescindere) se si ciclo intorno in attesa di ID specifici.

mi piacerebbe scrivere un piccolo programma C per fare l'attesa e la raccolta (se si dispone delle autorizzazioni necessarie per caricare e eseguibili pista), ma si può facilmente utilizzare la bash wait built-in per circa il Allo stesso scopo, anche se con meno flessibilità.

Modifica : piccolo esempio

.
#!/bin/bash

...
waitfor=''

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

wait $waitfor
...

Se si esegue questo script in background, non sarà fastidio e ciò che viene dopo il wait linea sarà eseguito quando i lavori sono finiti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top