フラスコスクリプトを使ってフラスコアプリケーションを停止できるコマンドを実装したいです。私はしばらくの間解決策を探しました。フレームワークは API を提供していないため、app.stop()
これをどのようにコーディングするかについて興味があります。私は Ubuntu 12.10 と Python 2.7.3 に取り組んでいます。
16 に答える
デスクトップでサーバーを実行しているだけの場合は、エンドポイントを公開してサーバーを強制終了できます (詳細は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.get('/shutdown')
def shutdown():
shutdown_server()
return 'Server shutting down...'
これは、より封じ込められた別のアプローチです。
from multiprocessing import Process
server = Process(target=app.run)
server.start()
# ...
server.terminate()
server.join()
これが役立つかどうか教えてください。
これは少し古いスレッドですが、基本的なフラスコ アプリを実験、学習、またはテストしている人が、バックグラウンドで実行されるスクリプトから開始した場合、それを停止する最も簡単な方法は、アプリを実行しているポートで実行されているプロセスを強制終了することです。の上。注: 作成者がアプリを強制終了または停止しない方法を探していることは承知しています。しかし、これは学習している人を助けるかもしれません。
sudo netstat -tulnp | grep :5001
このようなものが得られます。
tcp 0 0 0.0.0.0:5001 0.0.0.0:* リッスン 28834/python
アプリを停止するには、プロセスを強制終了します
sudo kill 28834
私の方法はbash端末/コンソールから進めることができます
1) 実行してプロセス番号を取得する
$ ps aux | grep yourAppKeywords
2a) プロセスを強制終了する
$ kill processNum
2b)上記が機能しない場合はプロセスを強制終了します
$ kill -9 processNum
他の人が指摘したようにwerkzeug.server.shutdown
、リクエストハンドラーからのみ使用できます。別の機会にサーバーをシャットダウンする唯一の方法は、自分自身にリクエストを送信することです。たとえば、/kill
次のスニペットのハンドラーは、次の 1 秒間に別のリクエストが来ない限り、開発サーバーを強制終了します。
import requests
from threading import Timer
from flask import request
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.post('/seriouslykill')
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.post('/kill')
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..."
リクエストとレスポンスの処理の外にいる場合でも、次のことができます。
import os
import signal
sig = getattr(signal, "SIGKILL", signal.SIGTERM)
os.kill(os.getpid(), sig)