如何停止烧瓶应用程序,而使用Ctrl-C(How to stop flask application

2019-07-22 13:28发布

我想实现一个命令,它可以通过使用烧瓶脚本停止烧瓶中的应用。 我已经寻找了一段时间的解决方案。 由于框架不提供“app.stop()” API,我很好奇如何实现代码。 我工作在Ubuntu 12.10和Python 2.7.3。

Answer 1:

如果你是刚刚运行桌面上的服务器,可以公开端点杀死服务器(在读更多关机的简单服务器 ):

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...'

这是另一种方法是多个内含:

from multiprocessing import Process

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

让我知道,如果这有助于。



Answer 2:

我把它稍微不同的使用线程做

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()

我用它做端到端的RESTful API,因此测试,在那里我可以给使用Python请求库请求。



Answer 3:

我的方法可通过bash的终端/主机被起诉

1)运行,并得到进程号

$ ps aux | grep yourAppKeywords

2a)的杀死进程

$ kill processNum

2b)的杀过程中如果上述不工作

$ kill -9 processNum


Answer 4:

正如其他人所指出的那样,你只能使用werkzeug.server.shutdown从请求处理程序。 我发现关机在其他时间服务器的唯一方法是对请求发送给自己。 例如, /kill除非另一个请求在下一第二进来在这个片段处理程序将杀开发服务器:

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..."


Answer 5:

这是一个老问题,但谷歌搜索没有给我如何做到这一点任何见解。

因为我没看过的代码在这里正确! (DOH!)它的作用是提高RuntimeError当没有werkzeug.server.shutdownrequest.environ ...

那么,什么时候没有我们所能做的request是提高RuntimeError

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

和捕捉,当app.run()返回:

...
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
...

无需自己发送的请求。



Answer 6:

这是一个有点老线,但如果有人尝试,学习,或测试的基本瓶的应用程序,从在后台运行的脚本启动,最快的方式来阻止它杀了你正在运行的应用程序的端口上运行的过程上。 注:我知道作者是寻找一种方法不杀或停止应用程序。 但是,这可能会帮助别人谁是学习。

sudo netstat -tulnp | grep :5001

你会得到这样的事情。

TCP 0 0 0.0.0.0:5001 0.0.0.0:* LISTEN 28834 /蟒

要停止的应用程序,杀死进程

sudo kill 28834


文章来源: How to stop flask application without using ctrl-c