2010-10-07 11 views
5

Vorrei eseguire uno script quando tutti i lavori che ho inviato a un server sono terminati.come eseguire automaticamente uno script bash quando i miei lavori qsub sono finiti su un server?

per esempio, io mando

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

E torno un elenco dei processi avviati. Vorrei avviare automaticamente un altro script sul server per elaborare l'output di questi lavori una volta che tutti sono stati completati.

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

Se salvo ciascuno dei 1000 posti di lavoro id dalla chiamata di cui sopra in un file separato, ho potuto verificare il contenuto di ciascun file contro l'elenco aggiornato 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.

risposta

6

Dipende un po 'da quale scheduler di lavoro si sta utilizzando e quale versione, ma c'è un altro approccio che può essere preso anche se l'elaborazione dei risultati può essere fatta anche nella stessa coda del lavoro.

Un modo molto pratico di gestire un sacco di lavoro correlato nelle versioni più recenti della coppia (e con il motore della griglia e altri) è quello di avviare i singoli lavori come array di lavoro (vedere http://docs.adaptivecomputing.com/torque/4-1-4/Content/topics/commands/qsub.htm#-t). Ciò richiede in qualche modo la mappatura delle corse individuali ai numeri, il che può essere o meno conveniente; ma se puoi farlo per i tuoi lavori, semplifica enormemente la gestione dei lavori; puoi qsubli tutti in una riga, puoi ordinarli tutti in una volta (pur avendo la capacità di gestire i lavori individualmente).

Se si esegue questa operazione, è possibile inviare un lavoro di analisi che ha una dipendenza dall'array di lavori che verrà eseguito solo dopo aver completato tutti i lavori nell'array: (vedere http://docs.adaptivecomputing.com/torque/4-1-4/Content/topics/commands/qsub.htm#dependencyExamples). L'invio del lavoro sarà simile a:

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

dove analizzare.sh aveva lo script per fare l'analisi e 427 sarebbe l'id di lavoro della serie di lavori che hai lanciato. (Il [] significa solo correre dopo che tutti sono stati completati). La sintassi differisce per altri scheduler (ad esempio, SGE/OGE) ma le idee sono le stesse.

Ottenere questo diritto può richiedere un po 'di attività, e certamente l'approccio di Tristan ha il vantaggio di essere semplice e di lavorare con qualsiasi programmatore; ma imparare a usare gli array di lavoro in questa situazione se ne farai molto potrebbe valere la pena.

6

Qualcosa che potreste considerare è avere uno script di lavoro basta toccare un nome file in una cartella dedicata come $i.jobdone, e nel vostro master script, potete semplicemente usare ls *.jobdone | wc -l per testare il giusto numero di lavori eseguiti.

1

È possibile utilizzare attendere per interrompere l'esecuzione fino al termine di tutti i lavori. È anche possibile raccogliere tutti gli stati di uscita e altre statistiche di corsa (tempo impiegato, conteggio dei lavori eseguiti al momento, qualunque cosa) se si va in giro in attesa di determinati ID.

che avrei scritto un piccolo programma C per fare l'attesa e la raccolta (se si dispone di autorizzazioni per caricare ed eseguire gli eseguibili), ma si può facilmente utilizzare la bash attendere built-in per circa lo 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 ti disturberà e ciò che viene dopo la attendere linea sarà eseguito quando i lavori sono finiti.

Problemi correlati