порт сервера python flask дефорсирован 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 и верните "успех"
  3. остановить фляжный сервер: просто используйте Ctrl+c, чтобы остановить
  4. снова запустите сервер flask, он вызовет исключение:
    #P3#
  5. используйте sh $ netstat -ntlp | grep 5000, порт был дефорсирован ntpd

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


person qiuping    schedule 25.01.2016    source источник
comment
каков ответ команды curl, которую вы запустили? кроме того, иногда требуется больше минуты, чтобы закрыть открытые порты tcp даже после того, как соответствующий процесс мертв.   -  person Murali Mopuru    schedule 25.01.2016
comment
«curl» вернет «успех» и перезапустит сервер ntp. Долго ждать, порт все равно дефорсирован ntpd   -  person qiuping    schedule 25.01.2016


Ответы (1)


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

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

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

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

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

person satoru    schedule 25.01.2016