programas - scripts bash ejemplos
¿Cómo ejecutar automáticamente un script bash cuando mis trabajos qsub terminen en un servidor? (3)
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 versiones más recientes de torque (y con grid engine, entre otros) es iniciar cualquier trabajo individual como una matriz de trabajo (consulte 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, podría enviar un trabajo de análisis que dependiera 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 ). Enviar el trabajo sería como:
qsub analyze.sh -W depend=afterokarray:427[]
donde analyze.sh tenía la secuencia de comandos para realizar el análisis, y 427 sería la identificación de trabajo de la matriz de trabajos que inició. (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.
Hacer esto bien puede llevar algo de esfuerzo, y ciertamente el enfoque de Tristan tiene la ventaja de ser simple y 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.
Me gustaría ejecutar un script cuando se hayan realizado todos los trabajos que he enviado a un servidor.
por ejemplo, envío
ssh server "for i in config*; do qsub ./run 1 $i; done"
Y obtengo 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.
Agradecería cualquier consejo que me ayudaría a evitar la siguiente solución poco elegante:
Si guardo cada uno de los 1000 identificadores de trabajo de la llamada anterior en un archivo separado, podría verificar el contenido de cada archivo con la lista actual de trabajos en ejecución, es decir, salir de una llamada a:
ssh qstat
Solo necesitaría chequear cada media hora, pero me imagino que hay una mejor manera.
Algo que podría considerar es tener cada script de trabajo simplemente toque un nombre de archivo en una carpeta dedicada como $i.jobdone
, y en su script maestro, simplemente podría usar ls *.jobdone | wc -l
ls *.jobdone | wc -l
para evaluar el número correcto de trabajos realizados.
Puede usar wait 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.
Escribiría un pequeño programa de C para hacer la espera y la recopilación (si tienes permisos para cargar y ejecutar ejecutables), pero puedes usar fácilmente el bash wait incorporado para más o menos el mismo propósito, aunque con menos flexibilidad.
Edición : pequeño ejemplo.
#!/bin/bash
...
waitfor=''''
for i in tasks; do
task &
waitfor="$waitfor $!"
done
wait $waitfor
...
Si ejecuta este script en segundo plano, no le molestará ni lo que venga después de que se ejecute la línea de espera cuando terminen sus trabajos.