Подтвердить что ты не робот

Как остановить приложение колбы без использования ctrl-c

Я хочу реализовать команду, которая может остановить приложение колбы, используя флажок script. Я некоторое время искал решение. Поскольку структура не предоставляет API-интерфейс app.stop(), мне интересно, как это кодировать. Я работаю над Ubuntu 12.10 и Python 2.7.3.

4b9b3361

Ответ 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()

Позвольте мне знать, если это помогает.

Ответ 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.

Ответ 3

Мой метод можно продолжить с помощью bash terminal/console

1) запустите и получите номер процесса

$ ps aux | grep yourAppKeywords

2a) убить процесс

$ kill processNum

2b) убить процесс, если выше не работает

$ kill -9 processNum

Ответ 4

Как уже отмечали другие, вы можете использовать werkzeug.server.shutdown только из обработчика запросов. Единственный способ, которым я нашел, чтобы выключить сервер в другое время, - это отправить запрос самому себе. Например, обработчик /kill в этом фрагменте завершит работу сервера 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..."

Ответ 5

Это старый вопрос, но поиск в Google не дал мне никакого представления о том, как этого добиться.

Потому что я не прочитал код здесь должным образом! (Doh!) Он поднимает RuntimeError, когда в request.environ нет werkzeug.server.shutdown...

То, что мы можем сделать, когда нет 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
...

Не нужно отправлять себе запрос.

Ответ 6

Это немного старая тема, но если кто-то экспериментирует, изучает или тестирует базовое приложение фляги, запускается из скрипта, который работает в фоновом режиме, самый быстрый способ остановить это - убить процесс, запущенный на порте, на котором вы запускаете приложение на. Примечание. Мне известно, что автор ищет способ не убивать и не останавливать приложение. Но это может помочь тому, кто учится.

sudo netstat -tulnp | grep :5001

Вы получите что-то вроде этого.

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

Чтобы остановить приложение, убейте процесс

sudo kill 28834

Ответ 7

Вы можете использовать метод ниже

app.do_teardown_appcontext()

Ответ 8

Для Windows довольно легко остановить/убить флеш-сервер -

  1. Перейти к диспетчеру задач
  2. Найти flask.exe
  3. Выбрать и завершить процесс