2011-12-30 11 views
28

Usiamo operatori di ingranaggi PHP per eseguire diverse attività in parallelo. Tutto funziona bene, e ho uno stupido script di shell per farli girare quando li voglio. Essendo un programmatore (e quindi pigro), volevo vedere se riuscivo a capovolgerli tramite una sceneggiatura.Avvio automatico di istanze multiple upstart

ho capito come utilizzare la strofa esempio, così ho potuto iniziare con un numero di istanza:

description "Async insert workers" 
author  "Mike Grunder" 

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

instance $N 

script 
    php $SCRIPT_PATH/worker.php 
end script 

E questo funziona alla grande, per avviarli in questo modo:

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

Il il modo in cui voglio utilizzare questi lavoratori è di farne girare un numero (forse uno per core, ecc.) e vorrei farlo all'avvio. Per essere chiari, non ho bisogno dello script upstart per rilevare il numero di core. Sono felice di dire "fai 8 istanze", ma è per questo che voglio eseguire più attività. C'è un modo per me di usare la clausola "start on" in uno script upstart per farlo automaticamente?

Ad esempio, avviare esempio 1, 2, 3, 4? Quindi farli uscire allo spegnimento correttamente?

Suppongo che potrei collegarlo a uno script init.d, ma mi chiedevo se l'upstart può gestire qualcosa di simile, o se qualcuno ha capito questo problema.

Ciao ragazzi!

risposta

40

Quello che vi serve è un compito bootstrap che viene eseguito all'avvio e itera su tutti i lavori dei lavoratori, a partire da ciascuno di essi.

#/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 chiave è quello di rendere questo un compito , che dice a Upstart per consentire l'esecuzione del compito di completamento prima di emettere qualsiasi evento per esso. Vedere http://upstart.ubuntu.com/cookbook/#task e http://upstart.ubuntu.com/cookbook/#instance

+0

Grazie mille! Ho provato a risolverlo in un modo simile, ma mi mancava il bit 'task', quindi la prima iterazione del ciclo sarebbe solo bloccata. Eccezionale. :) – mkgrunder

+11

Dovresti anche controllare http://stackoverflow.com/questions/12084025/restarting-upstart-instance-prcesses che consente non solo di avviare più istanze, ma anche di fermarle. – Evgeny

+0

Ho letto la documentazione ma ancora non la capisco, perché il blocco del ciclo nella prima iterazione a meno che non sia un compito?/cc @mkgrunder – Mahn