Comment puis-je résilier un flacon application qui s'exécute en tant que service?
J'ai pu acquérir mon flacon d'application qui s'exécute comme un service grâce à Est-il possible d'exécuter un script Python en tant que service sous Windows? Si possible, comment?, mais quand il s'agit de l'arrêt, je ne peux pas. J'ai terminer le processus dans le gestionnaire des tâches.
Voici mon run.py ce qui me tourner vers un service via run.py installer:
from app import app
from multiprocessing import Process
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
class AppServerSvc (win32serviceutil.ServiceFramework):
_svc_name_ = "CCApp"
_svc_display_name_ = "CC App"
def __init__(self,args):
win32serviceutil.ServiceFramework.__init__(self,args)
self.hWaitStop = win32event.CreateEvent(None,0,0,None)
socket.setdefaulttimeout(60)
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
server.terminate()
server.join()
def SvcDoRun(self):
servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
(self._svc_name_,''))
self.main()
def main(self):
server = Process(app.run(host = '192.168.1.6'))
server.start()
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(AppServerSvc)
J'ai eu le processus de trucs de ce post: http://librelist.com/browser/flask/2011/1/10/start-stop-flask/#a235e60dcaebaa1e134271e029f801fe mais malheureusement il ne fonctionne pas non plus.
Le fichier journal de l'Observateur d'Événements, dit que la variable globale "serveur" n'est pas défini. Cependant, j'ai fait serveur une variable globale et il me donne toujours la même erreur.
server
n'est pas défini dans SvcStop
, c'est pourquoi vous obtenez ce message d'erreur. 2. server = Process(app.run(host = '192.168.1.6'))
ne fait pas ce que vous pensez que cela fonctionne. Pourquoi pensez-vous que vous avez besoin pour exécuter l'application dans un processus distinct de toute façon?Comment avez-vous mis le serveur en tant que variable globale? Les variables locales de l'ombre mondiales en Python automatiquement, de sorte que vous devrez peut-être utiliser le
global
de l'instruction pour l'affecter à des variables globales dans une portée locale.J'ai seulement ajouté que le serveur et le processus de code parce que je cherchais un moyen de résilier le serveur dans SvcStop. Il est d'application.run() pour flacon, mais il n'est pas d'application.stop() ou son équivalent.
J'ai essayé ce, en faisant:
global server server = Process(app.run(host= '192.168.1.6'))
Flacon à l'écoute de SIGINT pour voir si elle doit quitter. Vous pourriez peut-être envoyer un signal à vous-même dans
SvcStop
? Alternativement, si vous avez vraiment vraiment envie de courir à l'application dans un processus distinct, assurez-vous de définir le target
mot-clé arg à app.run
au lieu de l'appeler app.run
directement.
OriginalL'auteur Chockomonkey | 2014-05-09
Vous devez vous connecter pour publier un commentaire.
Je vous recommande d'utiliser http://supervisord.org/. En fait ne pas fonctionner dans Windows, mais avec Cygwin, vous pouvez exécuter superviseur sous Linux, y compris exécuter en tant que service.
Pour installer Supervisord: https://stackoverflow.com/a/18032347/3380763
Après l'installation, vous devez configurer l'application, voici un exemple: http://flaviusim.com/blog/Deploying-Flask-with-nginx-uWSGI-and-Supervisor/ (n'Est pas nécessaire que vous utilisez Nginx avec le Superviseur de la configuration est assez)
OriginalL'auteur yograterol
Vous pouvez arrêter le serveur web de Werkzeug gracieusement avant de vous arrêtez de le Win32 serveur. Exemple:
Si vous ajoutez ceci à votre ballon de serveur, vous pouvez alors demander un recours gracieux à l'arrêt du serveur par l'envoi d'un
POST
demande à/shutdown
. Vous pouvez utiliser des requêtes ou urllib2 pour ce faire. Selon votre situation, vous pouvez avoir besoin pour protéger cette route contre les accès non autorisés.Une fois que le serveur s'est arrêté je pense que vous n'avez pas de problème d'arrêt du service Win32.
Noter que le code d'arrêt ci-dessus apparaît dans ce Flacon d'extrait de.
Est-il possible d'obtenir un zéro valeur de retour?
OriginalL'auteur Miguel
Vous pouvez aussi tromper de Flacon en lui faisant croire que vous avez appuyé sur Ctrl + C:
Puis il suffit d'appeler
shutdown_flask()
dans votreSvcStop()
:Devrait
shutdown_flask()
échouer pour une raison quelconque,os._exit()
permet de s'assurer que votre service fin (quoique avec un méchant avertissement), par l'arrêt de l'interprète.OriginalL'auteur JohnTheWalker