2010-10-07 12 views
5

Me gustaría ejecutar un script cuando se hayan realizado todos los trabajos que he enviado a un servidor.cómo ejecutar automáticamente un script bash cuando mis trabajos qsub se terminan en un servidor?

por ejemplo, yo envío

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

Y obtener una lista de los trabajos que se iniciaron. Me gustaría iniciar automáticamente otra secuencia de comandos en el servidor para procesar la salida de estos trabajos una vez que se completen.

Le agradecería cualquier consejo que ayudaría a evitar la siguiente solución poco elegante:

Si ahorro cada una de las 1000 Número de Identificación del de la llamada anterior en un archivo separado, pude comprobar el contenido de cada archivo en contra la lista actual de los trabajos en ejecución, es decir, la salida de una llamada a:

ssh qstat 

sólo tendrían que comprobar cada media hora, pero me imagino que hay una mejor manera.

Respuesta

6

Depende un poco del programador de tareas que esté utilizando y de la versión, pero también se puede aplicar otro enfoque si el procesamiento de resultados también se puede realizar en la misma cola que el trabajo.

Una forma muy práctica de administrar muchos trabajos relacionados en las versiones más recientes de par (y con motor de red, y otros) es iniciar las tareas individuales como una matriz de trabajo (http://docs.adaptivecomputing.com/torque/4-1-4/Content/topics/commands/qsub.htm#-t). Esto requiere asignar las ejecuciones individuales a los números de alguna manera, lo que puede o no ser conveniente; pero si puede hacerlo para sus trabajos, simplifica enormemente la administración de los trabajos; puede qsub todos ellos en una línea, puede qdel o qhold todos a la vez (mientras que todavía tiene la capacidad de ocuparse de trabajos individualmente).

Si hace esto, puede enviar un trabajo de análisis que dependía de la matriz de trabajos que solo se ejecutaría una vez que se completaran todos los trabajos en la matriz: (consulte http://docs.adaptivecomputing.com/torque/4-1-4/Content/topics/commands/qsub.htm#dependencyExamples). La presentación del trabajo se vería así:

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

where analizar.sh tenía la secuencia de comandos para hacer el análisis, y 427 sería la identificación de trabajo de la serie de trabajos que lanzó. (El [] significa solo ejecutar después de que todos hayan sido completados). La sintaxis difiere para otros programadores (por ejemplo, SGE/OGE) pero las ideas son las mismas.

Obtener este derecho puede tomar algunas medidas, y ciertamente el enfoque de Tristan tiene la ventaja de ser simple y de trabajar con cualquier planificador; pero aprender a usar matrices de trabajos en esta situación, si va a hacer mucho de esto, puede valer la pena.

6

Algo que podría considerar está teniendo cada script de trabajo sólo tiene que tocar un nombre de archivo en una carpeta específica como $i.jobdone, y en el script principal, que podría simplemente utilizar ls *.jobdone | wc -l para comprobar el número correcto de los trabajos realizados.

1

Puede usar esperar para detener la ejecución hasta que todos sus trabajos estén terminados. Incluso puede recopilar todos los estados de salida y otras estadísticas en ejecución (tiempo que tardó, recuento de trabajos realizados en el momento, lo que sea) si hace un ciclo esperando identificaciones específicas.

me gustaría escribir un pequeño programa en C para hacer la espera y la recolección (si tiene permisos para cargar y ejecutar archivos ejecutables), pero se puede utilizar fácilmente la fiesta esperar integrado por aproximadamente el mismo propósito, aunque con menos flexibilidad.

Editar: pequeño ejemplo.

#!/bin/bash 

... 
waitfor='' 

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

wait $waitfor 
... 

Si ejecuta este script en el fondo, no usted y lo que viene después de la esperar línea se ejecuta cuando sus trabajos son más molestará.

Cuestiones relacionadas