Порт сервера фляги 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()
Тогда я действовал следующим образом:
- запустить колбу сервер: python test_flask.py
- curl " http://localhost:5000/restart_ntpd. Затем перезагрузите ntpd и верните"success"
- остановка сервера фляги: просто используйте Ctrl+c, чтобы остановить
- Запустите флеш-сервер снова, это вызовет исключение:
socket.error: [Errno 98] Адрес уже используется.
- использование
sh $ netstat -ntlp | grep 5000
порт был деформированntpd
я думаю ntpd
будет использовать порт 123 по умолчанию. В моей сцене, почему порт 5000 деформируется ntpd
? Это проблема колбы?
1 ответ
ntpd
не слушает сам TCP-порт 5000, это среда, в которой он работает - процесс.
И этот процесс является дочерним процессом вашего сервера Flask, который открывает сокет, прослушивающий TCP-порт 5000.
Этот сокет наследуется в дочернем процессе, и поскольку ntpd
процесс длительный, он продолжает работать с сокетом, который он унаследовал от вас, занимая порт 5000.
Проверьте, как бороться с убитым Python BaseHTTPServer, но порт все еще занят? о том, как предотвратить дочерние процессы от наследования сокета.
Конечно, сначала вы должны найти способ настроить способ запуска сервера Flask.