Cómo detener la aplicación del matraz sin usar ctrl-c

Quiero implementar un comando que pueda detener la aplicación del matraz utilizando el script flask. He buscado la solución por un tiempo. Debido a que el marco no proporciona la API “app.stop ()”, tengo curiosidad acerca de cómo codificar esto. Estoy trabajando en Ubuntu 12.10 y Python 2.7.3.

Si solo está ejecutando el servidor en su escritorio, puede exponer un punto final para destruir el servidor (lea más en Apagar el servidor simple ):

from flask import request def shutdown_server(): func = request.environ.get('werkzeug.server.shutdown') if func is None: raise RuntimeError('Not running with the Werkzeug Server') func() @app.route('/shutdown', methods=['POST']) def shutdown(): shutdown_server() return 'Server shutting down...' 

Aquí hay otro enfoque que está más contenido:

 from multiprocessing import Process server = Process(target=app.run) server.start() # ... server.terminate() server.join() 

Déjeme saber si esto ayuda.

Lo hice ligeramente diferente usando hilos.

 from werkzeug.serving import make_server class ServerThread(threading.Thread): def __init__(self, app): threading.Thread.__init__(self) self.srv = make_server('127.0.0.1', 5000, app) self.ctx = app.app_context() self.ctx.push() def run(self): log.info('starting server') self.srv.serve_forever() def shutdown(self): self.srv.shutdown() def start_server(): global server app = flask.Flask('myapp') ... server = ServerThread(app) server.start() log.info('server started') def stop_server(): global server server.shutdown() 

Lo uso para hacer pruebas de extremo a extremo para una api tranquila, donde puedo enviar solicitudes utilizando la biblioteca de solicitudes de python.

Mi método se puede proceder a través de bash terminal / console

1) ejecutar y obtener el número de proceso

 $ ps aux | grep yourAppKeywords 

2a) matar el proceso

 $ kill processNum 

2b) mata el proceso si arriba no funciona

 $ kill -9 processNum 

Como han señalado otros, solo puede utilizar werkzeug.server.shutdown desde un controlador de solicitudes. La única forma que encontré de cerrar el servidor en otro momento es enviarnos una solicitud. Por ejemplo, el controlador /kill en este fragmento matará el servidor dev a menos que aparezca otra solicitud durante el siguiente segundo:

 import requests from threading import Timer import time LAST_REQUEST_MS = 0 @app.before_request def update_last_request_ms(): global LAST_REQUEST_MS LAST_REQUEST_MS = time.time() * 1000 @app.route('/seriouslykill', methods=['POST']) def seriouslykill(): func = request.environ.get('werkzeug.server.shutdown') if func is None: raise RuntimeError('Not running with the Werkzeug Server') func() return "Shutting down..." @app.route('/kill', methods=['POST']) def kill(): last_ms = LAST_REQUEST_MS def shutdown(): if LAST_REQUEST_MS <= last_ms: # subsequent requests abort shutdown requests.post('http://localhost:5000/seriouslykill') else: pass Timer(1.0, shutdown).start() # wait 1 second return "Shutting down..." 

Esta es una pregunta antigua, pero Google no me dio ninguna idea de cómo lograr esto.

¡Porque no leí el código aquí correctamente! (Doh!) Lo que hace es generar un RuntimeError cuando no hay werkzeug.server.shutdown en el request.environ

Entonces, lo que podemos hacer cuando no hay una request es generar un RuntimeError

 def shutdown(): raise RuntimeError("Server going down") 

y atrapa eso cuando app.run() devuelve:

 ... try: app.run(host="0.0.0.0") except RuntimeError, msg: if str(msg) == "Server going down": pass # or whatever you want to do when the server goes down else: # appropriate handling/logging of other runtime errors # and so on ... 

No es necesario que te envíes una solicitud.

Este es un hilo un poco viejo, pero si alguien está experimentando, aprendiendo o probando la aplicación básica del flask, se inició desde un script que se ejecuta en segundo plano, la forma más rápida de detenerlo es detener el proceso que se ejecuta en el puerto en el que está ejecutando su aplicación. en. Nota: soy consciente de que el autor está buscando una forma de no matar o detener la aplicación. Pero esto puede ayudar a alguien que está aprendiendo.

 sudo netstat -tulnp | grep :5001 

Obtendrás algo como esto.

tcp 0 0 0.0.0.0:5001 0.0.0.0:* ESCUCHAR 28834 / python

Para detener la aplicación, mata el proceso.

 sudo kill 28834