Betroffene Version: neueste (4.1.1)
Preforked-Worker ignorieren das Sigterm-Signal - nur der für das Warm-Shutdown verantwortliche übergeordnete Prozess reagiert darauf und fährt die untergeordneten Prozesse ordnungsgemäß herunter.
Wenn vorverzweigte Worker-Prozesse ein Sigterm erhalten, werden sie sofort heruntergefahren (z. B. kill <pid>
):
celery_1 | [2018-06-04 09:19:57,376: ERROR/MainProcess] Process 'ForkPoolWorker-2' pid:26 exited with 'signal 15 (SIGTERM)'
Wenn ein Sigterm den übergeordneten Worker-Prozess erreicht, wird ein Warm-Shutdown durchgeführt. Wenn zwischenzeitlich auch die vorgegabelten Arbeiter ein Begriffssignal bekommen, werden die Aufgaben einfach getötet.
Ich kann keinen Weg finden, einen ordnungsgemäßen Shutdown-Sellerie in einem Docker-Container mit einem Init-System durchzuführen.
(siehe Mailingliste: https://groups.google.com/forum/#!topic/celery-users/9UF_VyzRt8Q). Es scheint, dass ich darauf achten muss, dass der Begriff Signal nur den übergeordneten Prozess erreicht, nicht jedoch einen der vorverzweigten Arbeiter. Dies scheint sehr schwierig zu sein, wenn ein Bash-Skript mit mehreren Sellerie-Instanzen ausgeführt wird (z. B. Beat und zwei Warteschlangen).
Ist es möglich, eine Funktion hinzuzufügen, die es erlaubt, dass Prefork-Worker-Prozesse das Sigterm ignorieren?
Um beim Starten mehrerer Prozesse in einem Docker-Container eine ordnungsgemäße Signalausbreitung zu erzielen, benötigen Sie wahrscheinlich einen Prozessmanager wie Supervisord .
Für weitere Informationen finden Sie hier eine Übersicht darüber, wie Docker Dinge stoppt: https://www.ctl.io/developers/blog/post/gracefully-stopping-docker-containers/#docker -stop
Wenn Sie Docker bereits verwenden, würde ich empfehlen, einen Arbeiter pro Container zu entlassen.
Es ist einfacher zu verwalten und Container haben nicht so viel Overhead. Auch die automatische Skalierung ist einfacher, wenn Tools wie k8s verwendet werden.
Eine letzte Sache. Wenn Sie wirklich Ihr eigenes Bash-Skript erstellen möchten, um mehrere Worker zu verwalten, müssten Sie jeden Worker hochfahren und dann auf
Wenn das passiert, können Sie die Arbeiter-PID holen und dann jeden einzelnen anmutig stoppen.
Was im Grunde das ist, was Supervisord tut, wie @georgepsarakis betonte.
Danke @georgepsarakis und @xirdneh für deine hilfreichen Vorschläge. Ich habe es geschafft, mit Supervisord ein funktionierendes Setup zu bekommen! 🎉
Ein Arbeiter pro Container ist auch ein sehr guter Vorschlag! Danke vielmals!
Hilfreichster Kommentar
Danke @georgepsarakis und @xirdneh für deine hilfreichen Vorschläge. Ich habe es geschafft, mit Supervisord ein funktionierendes Setup zu bekommen! 🎉
Ein Arbeiter pro Container ist auch ein sehr guter Vorschlag! Danke vielmals!