[python] Ctrl-C를 사용하지 않고 플라스크 응용 프로그램을 중지하는 방법

플라스크 스크립트를 사용하여 플라스크 응용 프로그램을 중지 할 수있는 명령을 구현하고 싶습니다. 나는 잠시 동안 해결책을 찾았습니다. 프레임 워크는 “app.stop ()”API를 제공하지 않기 때문에 코드 작성 방법이 궁금합니다. Ubuntu 12.10 및 Python 2.7.3에서 작업 중입니다.



답변

데스크톱에서 서버를 실행하는 경우 엔드 포인트를 노출하여 서버를 종료 할 수 있습니다 (자세한 내용은 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()

이것이 도움이되는지 알려주세요.


답변

실을 사용하여 약간 다르게했습니다

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

파이썬 요청 라이브러리를 사용하여 요청을 보낼 수있는 안정적인 API에 대한 종단 간 테스트를 수행하는 데 사용합니다.


답변

이것은 약간 오래된 스레드이지만, 누군가가 백그라운드에서 실행되는 스크립트에서 시작된 기본 플라스크 앱을 실험, 학습 또는 테스트하는 경우이를 중지하는 가장 빠른 방법은 앱을 실행중인 포트에서 실행중인 프로세스를 종료하는 것입니다. 의 위에. 참고 : 저자가 앱을 종료하거나 중지하지 않는 방법을 찾고 있다는 것을 알고 있습니다. 그러나 이것은 배우는 사람에게 도움이 될 수 있습니다.

sudo netstat -tulnp | grep :5001

당신은 이와 같은 것을 얻을 것입니다.

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

앱을 중지하려면 프로세스를 종료하십시오.

sudo kill 28834


답변

내 방법은 bash 터미널 / 콘솔을 통해 진행할 수 있습니다.

1) 실행하고 프로세스 번호 얻기

$ ps aux | grep yourAppKeywords

2a) 프로세스 종료

$ kill processNum

2b) 위가 작동하지 않으면 프로세스를 종료하십시오.

$ kill -9 processNum


답변

다른 사람들이 지적했듯이 werkzeug.server.shutdown요청 핸들러 에서만 사용할 수 있습니다 . 다른 시간에 서버를 종료하는 유일한 방법은 자신에게 요청을 보내는 것입니다. 예를 들어, /kill이 스 니펫 의 핸들러는 다음 1 초 동안 다른 요청이 들어오지 않는 한 dev 서버를 종료합니다.

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


답변

이것은 오래된 질문이지만 인터넷 검색은 이것을 수행하는 방법에 대한 통찰력을주지 못했습니다.

여기서 코드를 제대로 읽지 않았기 때문에 ! (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
...

자신에게 요청을 보낼 필요가 없습니다.


답변

“CTRL-C”를 누를 필요는 없지만이를 수행하는 엔드 포인트를 제공 할 수 있습니다.

from flask import Flask, jsonify, request
import json, os, signal

@app.route('/stopServer', methods=['GET'])
def stopServer():
    os.kill(os.getpid(), signal.SIGINT)
    return jsonify({ "success": True, "message": "Server is shutting down..." })

이제이 끝점을 호출하여 서버를 정상적으로 종료 할 수 있습니다.

curl localhost:5000/stopServer