2013-11-26 12 views

Antwort

5

Sie sollten in der Lage sein, eine Event Listener zu verwenden, die das Dateisystem überwacht (mit vielleicht watchdog) und einen Neustart unter Verwendung der XML-RPC API ausgibt. Überprüfen Sie die memmon Listener aus dem superlance Paket zur Inspiration. Es müsste nicht so kompliziert sein. Und da der Watchdog Ihre Neustartroutine aufrufen würde, müssen Sie die Ereignisse nicht mit childutils.listener.wait lesen.

Alternativ können Git-Hooks den Trick machen, wenn die Berechtigungen für die supervisord-API korrekt sind (Socket-Berechtigungen, HTTP-Passwörter). Ein einfacher, aber weniger sicherer Ansatz.

Ein einfacherer und sogar weniger sicherer Ansatz wäre, Ihnen die Ausgabe eines supervisorctl restart zu ermöglichen. Der laufende Benutzer muss mit Ihrem Push-Benutzer übereinstimmen (oder git oder www, je nachdem, wie Sie ihn eingerichtet haben). Es gibt viele Möglichkeiten, um es sicherheitshalber falsch zu machen. Aber für die Entwicklung, könnte es gut gehen.

Verwandte:

+6

Also, das ist nicht wirklich eine Lösung, mehr wie "wie man eine Lösung erstellt." Jetzt ist es fast 3 Jahre später, gibt es immer noch keine wirkliche Lösung für das, was mir als ein extrem häufiges Problem erscheint? – hackel

5

ich auch keine Lösung gefunden, so habe ich versucht, meine eigenen zu machen. Here it is.

Sie können das Paket durch diesen Befehl installieren:

pip install git+https://github.com/stavinsky/supervisord-touch-reload.git 

(ich es PyPI nach der Zugabe von ein paar Tests hinzufügen.)

Ein Beispiel für Supervisor in examples Einrichtung Ordner in GitHub. Die Dokumentation wird sehr bald sein, glaube ich. Grundsätzlich alles, was Sie brauchen dieses Modul starten verwendet wird Ereignis-Listener mit command wie hinzufügen:

python -m touch_reload --socket unix:///tmp/supervisor.sock --file <path/to file file> --program <program name>

wo file eine Datei ist, die directory Pfad mit absoluten oder relativen überwacht wird, socket die Fassung von supervisorctl ist Abschnitt und program ist Programmname von [program:<name>] Abschnitt Definition. Auch verfügbar --username und --password, die Sie verwenden können, wenn Sie benutzerdefinierte Supervisor-Konfiguration haben.

+1

Danke für die Veröffentlichung. Scheint gut zu funktionieren. Seltsamerweise, dass es keine eingebaute Lösung gibt, um so etwas zu tun – edwardmp

+0

Willkommen. Gut zu wissen, dass es für jemanden hilfreich war.Wenn Sie Probleme oder Ideen haben, wie Sie dieses Skript verbessern können, schreiben Sie mir hier oder auf github – Stavinsky

+0

Wird bei dieser Lösung nur eine Datei gleichzeitig überwacht? https://github.com/gorakhargosh/watchdog lässt dich ein ganzes Verzeichnis ansehen. –

1

Während keine Lösung, die Supervisor verwendet, löse ich dieses Problem in der Regel in der überwachten App. Fügen Sie zum Beispiel das Flag --reload zu gunicorn hinzu und es wird jedes Mal neu geladen, wenn sich Ihre App ändert.

Verwandte Themen