cómo ejecutar automáticamente un script bash cuando mis trabajos qsub están terminados en un servidor?

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

Pregunta

Me gustaría ejecutar un script cuando todos los trabajos que he enviado a un servidor se realizan.

Por ejemplo, puedo enviar

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 comenzar automáticamente otra secuencia de comandos en el servidor para procesar la salida de estos puestos de trabajo una vez que todos se han completado.

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

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

ssh qstat

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

¿Fue útil?

Solución

depende un poco de lo planificador de tareas que está utilizando y qué versión, pero no hay otro enfoque que puede ser tomado demasiado si los resultados del procesamiento también se puede hacer en la misma cola como el trabajo.

Una forma muy práctica de la gestión de una gran cantidad de trabajo relacionado en versiones más recientes de torque (y con el motor de la red, y otros) es poner en marcha los trabajos de cualquier individuo como una matriz de trabajo (cf. http://docs.adaptivecomputing.com/torque/4-1- 4 / contenido / temas / comandos / qsub.htm # -t ). Esto requiere la cartografía de las carreras individuales a números de alguna manera, que puede o puede no ser conveniente; pero si se puede hacer por sus puestos de trabajo, que se simplifica notablemente la gestión de los puestos de trabajo; puede qsub a todos en una sola línea, puede qdel o qhold todos a la vez (sin dejar de tener la capacidad de hacer frente a los trabajos de forma individual).

Si lo hace, entonces se podría presentar un trabajo de análisis que tenía una dependencia en el conjunto de puestos de trabajo que sólo se ejecutan una vez que todos los puestos de trabajo en la matriz completa eran: (cf. http://docs.adaptivecomputing.com/torque/4-1-4 /Content/topics/commands/qsub.htm#dependencyExamples ). Enviar la tarea se vería así:

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

donde analyze.sh tenían la secuencia de comandos para hacer el análisis, y 427 serían el ID de trabajo del conjunto de puestos de trabajo se puso en marcha. (Los medios [] única carrera después de todo se han completado). Los difiere de sintaxis para otros programadores (por ejemplo, SGE / OGE), pero las ideas son los mismos.

Obtener este derecho puede tomar un poco de trabajo, y sin duda el enfoque de Tristán tiene la ventaja de ser simple, y se trabaja con cualquier programador; pero aprender a utilizar matrices de trabajo en esta situación si se va a realizar un montón de esto puede ser digno de su tiempo.

Otros consejos

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 a prueba para el número correcto de los trabajos realizados.

Se puede utilizar espera para detener la ejecución hasta que todos los trabajos se realizan. Incluso puede recoger todos los estados de salida y otras estadísticas de funcionamiento (tiempo que tomó, conde de trabajos realizados en el momento, lo que sea) si el ciclo a esperar a que los identificadores específicos.

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 espera 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 se ejecuta este script en el fondo, no te va a molestar y lo que viene después de la espera línea se ejecuta cuando sus trabajos se han terminado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top