2011-12-30 27 views
28

Utilizamos PHP gearman workers para ejecutar varias tareas en paralelo. Todo funciona muy bien, y tengo un pequeño script de shell para hacerlos girar cuando los quiero. Siendo un programador (y, por lo tanto, flojo), quería ver si podía crearlos mediante un script advenedizo.Iniciando múltiples instancias upstart automáticamente

me di cuenta de cómo utilizar la estrofa ejemplo, por lo que podría comenzar con un número de instancia:

description "Async insert workers" 
author  "Mike Grunder" 

env SCRIPT_PATH="/path/to/my/script" 

instance $N 

script 
    php $SCRIPT_PATH/worker.php 
end script 

Y esto funciona muy bien, para empezar a ellas, así:

sudo start async-worker N=1 
sudo start async-worker N=2 

El La forma en que quiero utilizar estos trabajadores es hacer girar algunos de ellos (tal vez uno por núcleo, etc.), y me gustaría hacerlo al inicio. Para que quede claro, no necesito el script upstart para detectar la cantidad de núcleos. Me complace solo decir "hacer 8 instancias", pero es por eso que quiero ejecutar varias veces. ¿Hay alguna forma de que use la cláusula "start on" en un script upstart para hacer esto automáticamente?

Por ejemplo, inicie la instancia 1, 2, 3, 4? Entonces, ¿deben salir correctamente al apagar?

Supongo que podría enganchar esto en un script init.d, pero me preguntaba si el advenedizo puede manejar algo como esto, o si alguien ha resuelto este problema.

¡Salud, muchachos!

Respuesta

40

Lo que necesita es una tarea de rutina de arranque que se ejecuta al inicio y repite todos sus trabajos de trabajador, iniciando cada uno.

#/etc/init/async-workers-all.conf 

start on runlevel [2345] 

task 

env NUM_WORKERS=8 

script 
    for i in `seq 1 $NUM_WORKERS` 
    do 
    start async-worker N=$i 
    done 
end script 

La clave está en hacer de esto una tarea , que le indica a Upstart que dejar correr tarea hasta su finalización antes de emitir ningún evento para ella. Ver http://upstart.ubuntu.com/cookbook/#task y http://upstart.ubuntu.com/cookbook/#instance

+0

¡Muchas gracias! Traté de resolverlo de manera similar, pero me faltaba el bit 'tarea', por lo que la primera iteración del ciclo simplemente se bloquearía. Increíble. :) – mkgrunder

+11

También debe verificar http://stackoverflow.com/questions/12084025/restarting-upstart-instance-prcesses que permite no solo iniciar varias instancias, sino también detenerlas. – Evgeny

+0

He leído la documentación pero todavía no la entiendo, ¿por qué ese bloqueo de bucle en su primera iteración a menos que sea una tarea?/cc @mkgrunder – Mahn