2014-06-16 2 views
1

J'utilise le céleri d'une manière inhabituelle - Je crée un processus personnalisé lorsque le céleri est démarré, ce processus doit être exécuté tout le temps quand le céleri est en cours d'exécution. Celery travailleurs utilisent ce processus pour leurs tâches (les détails ne sont pas nécessaires)."celeryd stop" ne fonctionne pas

je lance le céleri de la ligne de commande et tout est ok:

celery -A celery_jobs.tasks.app worker -B --loglevel=warning 

Mais quand j'utilise celeryd pour daemonize le céleri, il n'y a aucun moyen de l'arrêter. La commande celeryd stop essaie d'arrêter le céleri mais ne finit jamais. Quand je vérifie les arbres de processus dans les deux cas, il y a la différence - quand on exécute à partir de la ligne de commande, le parent est évidemment un processus de céleri (processus principal qui a des employés céleri comme enfants). Tuer (arrêter) le processus de céleri parent va arrêter tous les travailleurs céleri et mon processus personnalisé.

Mais lors de l'exécution avec celeryd, mon processus personnalisé a parent /sbin/init - et appelant celeryd stop ne fonctionne pas - semble comme processus de céleri principal est en attente de quelque chose, ou est incapable d'arrêter mon processus personnalisé comme il est processus enfant de céleri .

Je ne sais pas grand-chose sur les processus et il n'est pas facile de trouver des informations, car je ne sais pas ce que je devrais rechercher, donc tous les conseils sont appréciés.

Répondre

0

Je suppose que votre processus personnalisé n'est pas un enfant de l'un de vos processus de travail de pool et n'a pas besoin d'être ainsi. J'utilise supervord au lieu de celeryd pour démoniser les travailleurs. Il peut également être utilisé pour démoniser d'autres processus. Tels que vos processus personnalisés.

Dans votre cas, votre supervord.conf peut comporter plusieurs sections. Un pour chaque nœud ouvrier céleri et un (ou plusieurs) pour vos processus personnalisés. Lorsque vous annulez le processus superviseur (avec -TERM), il prend également soin de terminer tous les travailleurs et votre processus personnalisé. Si vous utilisez -TERM, vous devrez vous assurer que vos processus personnalisés les gèrent.

+0

J'ai accepté cette réponse car je considère cette solution plus propre. – misoK

1

J'ai eu le même problème. Je avais besoin d'une solution rapide, donc je l'ai écrit ce script bash

#/bin/bash 

/etc/init.d/celeryd stop 
sleep 10 
export PIDS=`ps -ef | grep celery |grep -v 'grep' | awk '{print $2}'` 
for PID in $PIDS; do kill -9 $PID; done; 

Si le processus ne s'arrête pas au bout de 10 secondes, il est un long temps à guichet unique candidat, alors j'ai décidé d'arrêter brusquement

+0

Merci pour une solution rapide, il peut être utile si je ne trouve pas d'autre solution. – misoK