web-dev-qa-db-ja.com

ctrl-cを使用せずにflaskアプリケーションを停止する方法

フラスコスクリプトを使用してflaskアプリケーションを停止できるコマンドを実装したいと思います。しばらくの間、ソリューションを検索しました。フレームワークは「app.stop()」APIを提供しないため、これをコーディングする方法について興味があります。 Ubuntu 12.10およびPython 2.7.3で作業しています。

67
vic

デスクトップでサーバーを実行しているだけの場合は、エンドポイントを公開してサーバーを強制終了できます(詳細は Shutdown The Simple Server )。

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

これが役立つかどうか教えてください。

80
Zorayr

私はスレッドを使用してわずかに異なることをしました

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

pythonリクエストライブラリを使用してリクエストを送信できるREST APIのエンドツーエンドテストを行うために使用します。

21
Ruben Decrop

私の方法は、bashターミナル/コンソールから続行できます

1)プロセス番号を実行して取得する

$ ps aux | grep yourAppKeywords

2a)プロセスを強制終了する

$ kill processNum

2b)上記が機能しない場合、プロセスを強制終了する

$ kill -9 processNum
9
Nam G VU

他の人が指摘したように、リクエストハンドラからのみwerkzeug.server.shutdownを使用できます。別のときにサーバーをシャットダウンすることがわかった唯一の方法は、自分にリクエストを送信することです。たとえば、このスニペットの/killハンドラーは、次の1秒間に別の要求が来ない限り、devサーバーを強制終了します。

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

これは古い質問ですが、グーグルでこれを達成する方法についての洞察は得られませんでした。

コードはこちら を正しく読んでいなかったからです! (Doh!)werkzeug.server.shutdownrequest.environがないときにRuntimeErrorを上げることです。

したがって、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
...

自分でリクエストを送信する必要はありません。

5
jogco

これは少し古いスレッドですが、バックグラウンドで実行されるスクリプトから開始した基本的なflaskアプリを実験、学習、またはテストする場合、それを停止する最も簡単な方法は、アプリを実行しているポート。注:作成者がアプリを強制終了または停止しない方法を探していることは承知しています。しかし、これは学んでいる人を助けるかもしれません。

Sudo netstat -tulnp | grep :5001

このようなものが得られます。

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

アプリを停止するには、プロセスを強制終了します

Sudo kill 28834
3
R J

以下の方法を使用できます

app.do_teardown_appcontext()
0
Alex

Windowsの場合、flaskサーバーの停止/強制終了は非常に簡単です-

  1. Goto Task Manager
  2. Flask.exeを見つける
  3. プロセスを選択して終了
0
Sumit Bajaj