[Python] celery, uwsgi & smart-attach-daemon

Alessandro Dentella sandro a e-den.it
Mer 24 Set 2014 21:42:31 CEST


On Tue, Sep 23, 2014 at 08:30:15AM +0200, Roberto De Ioris wrote:
> 
> > Ciao a tutti,
> >
> >
> > sto cercando la configrazione ottimale per fare partire celery con
> > django in produzione.
> >
> > Uso nginx + uwsgi per l'applicazione principale e credevo leggendo [1]
> > [2] che smart-attach-daemon avrebbe potuo risolvere il problema di
> > garantirmi che un reload di uwsgi (uwsgi --reload) inviasse un segnale
> > al processo di celery.
> >
> > Forse ho compreso male la documentazione che in effetti non dice
> > esplicitamente cosa dovrebbe succedere ma solo ::
> >
> >
> >   Pidfile governed processes can survive death or reload of the master
> >   so long as their pidfiles are available and the pid contained
> >   therein matches a running pid. This is the best choice for processes
> >   requiring longer persistence, and for which a brutal kill could mean
> >   loss of data such as a database.
> >
> 
> smart-attach-daemon serve proprio ad evitare che un demone venga ucciso
> durante un riavvio. Effettivamente celery (almeno nella mia mente) e' uno
> di quei servizi che dovrebbe andare per fatti suoi, e quindi
> smart-attach-daemon e' l'approggio giusto.
> 
> Mi pare di capire pero' che tu invece vuoi che a ogni reload corrisponda
> anche un restart di celery, in questo caso attach-daemon e' quello che ti
> serve.
> 
> Eventualmente con attach-daemon2 hai un controllo maggiore sul comportamento:
> 
> https://github.com/unbit/uwsgi-docs/blob/master/AttachingDaemons.rst#--attach-daemon2

Sarebbe esattamente quello che cerco, ma non riesco assolutamente a
vedere alcun segnale.

La mia conf è:

celery_pid = /var/run/uwsgi/cogema-celery.pid
attach-daemon2 = cmd=/usr/local/sbin/test-signals.py %(celery_pid),pidfile=%(celery_pid),stopsignal=3,reloadsignal=15

La script test-signals.py è riportata in fondo.
Quando io faccio partire uwsgi nei log leggo:

[uwsgi-daemons] found valid/active pidfile for "/usr/local/sbin/test-signals.py /var/run/uwsgi/cogema-celery.pid" (pid: 31952)

Ma poi nessun segnale arriva al processo test-signals.py. Se da
console per prova eseguo kill -3 31952, vedo subito il log del segnale
arrivato. 

lumi?

grazie
sandro

===============================================
#!/usr/bin/python
import os
import sys
import time
import signal

def show(sig, frame):
    f = open('/tmp/sig.log', 'a')
    f.write("%s \n" % sig)

def sig_start():
    sigs = range(2,16)
    sigs.remove(9)
    for sig in sigs:
        signal.signal(sig, show)

## log the pid
#f = open('/var/run/uwsgi/cogema-celery.pid', 'w')
f = open(sys.argv[1], 'w')
f.write("%s\n" % os.getpid())
f.close()

sig_start()

while 1:
  time.sleep(5)


Maggiori informazioni sulla lista Python