Порт сервера фляги Python, деформированный ntpd

У меня есть сервер отдыха, реализованный на Python с колбой. И реализовать API для перезагрузки ntpd,
Код test_flask.py:

from flask import Flask
import subprocess
import logging
import sys

app = Flask(__name__)


def run_shell_cmd(cmd):
    logging.info("run cmd: %s", cmd)
    try:
        rc = subprocess.call(cmd, shell=True)
        if rc != 0:
            logging.error("Fail to run %s , rc: %s" % (cmd, rc))
    except OSError as e:
        logging.error("Fail to run cmd: %s" % e)
    return rc

@app.route("/restart_ntpd")
def restart():
    run_shell_cmd("service ntpd restart")
    return "Success!"

if __name__ == "__main__":
    LOG_FORMAT = '%(asctime)s, %(levelname)s, %(filename)s:%(lineno)d, %(message)s'
    logging.basicConfig(
        format=LOG_FORMAT,
        level=logging.INFO,
        stream=sys.stdout,
    )
    app.run()

Тогда я действовал следующим образом:

  1. запустить колбу сервер: python test_flask.py
  2. curl " http://localhost:5000/restart_ntpd. Затем перезагрузите ntpd и верните"success"
  3. остановка сервера фляги: просто используйте Ctrl+c, чтобы остановить
  4. Запустите флеш-сервер снова, это вызовет исключение:

    socket.error: [Errno 98] Адрес уже используется.

  5. использование sh $ netstat -ntlp | grep 5000порт был деформирован ntpd

я думаю ntpd будет использовать порт 123 по умолчанию. В моей сцене, почему порт 5000 деформируется ntpd? Это проблема колбы?

1 ответ

ntpd не слушает сам TCP-порт 5000, это среда, в которой он работает - процесс.

И этот процесс является дочерним процессом вашего сервера Flask, который открывает сокет, прослушивающий TCP-порт 5000.

Этот сокет наследуется в дочернем процессе, и поскольку ntpd процесс длительный, он продолжает работать с сокетом, который он унаследовал от вас, занимая порт 5000.

Проверьте, как бороться с убитым Python BaseHTTPServer, но порт все еще занят? о том, как предотвратить дочерние процессы от наследования сокета.

Конечно, сначала вы должны найти способ настроить способ запуска сервера Flask.

Другие вопросы по тегам