How do I terminate a flask app that's running as a service? How do I terminate a flask app that's running as a service? flask flask

How do I terminate a flask app that's running as a service?


You can stop the Werkzeug web server gracefully before you stop the Win32 server. Example:

from flask import requestdef 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...'

If you add this to your Flask server you can then request a graceful server shutdown by sending a POST request to /shutdown. You can use requests or urllib2 to do this. Depending on your situation you may need to protect this route against unauthorized access.

Once the server has stopped I think you will have to no problem stopping the Win32 service.

Note that the shutdown code above appears in this Flask snippet.


You could also trick Flask into believing you pressed Ctrl + C:

def shutdown_flask(self):    from win32api import GenerateConsoleCtrlEvent    CTRL_C_EVENT = 0    GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0)

Then simply call shutdown_flask() in your SvcStop():

try:    # try to exit gracefully    self.shutdown_flask()except Exception as e:    # force quit    os._exit(0)

Should shutdown_flask() fail for some reason, os._exit() makes sure your service will end (albeit with a nasty warning), by halting the interpreter.


I recommend you use http://supervisord.org/. Actually not work in Windows, but with Cygwin you can run supervisor as in Linux, including run as service.

For install Supervisord: https://stackoverflow.com/a/18032347/3380763

After install you must configure the app, here an example: http://flaviusim.com/blog/Deploying-Flask-with-nginx-uWSGI-and-Supervisor/ (Is not necessary that you use Nginx with the Supervisor's configuration is enough)