gpt4 book ai didi

python Flask 服务器端口被 ntpd 取消强制

转载 作者:太空宇宙 更新时间:2023-11-03 17:00:58 25 4
gpt4 key购买 nike

我有一个用python和flask实现的休息服务器。并实现一个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. 启动 Flask 服务器:python test_flask.py
  2. curl "http://localhost:5000/restart_ntpd 。然后 ntpd 重新启动并返回“成功”
  3. 停止flask服务器:只需使用Ctrl+c即可停止
  4. 再次启动flask服务器,会抛出异常:

    socket.error: [Errno 98] Address already in use.

  5. 使用sh $ netstat -ntlp | grep 5000,端口被 ntpd 强制解除

我认为ntpd默认会使用端口123。在我的场景中,为什么 端口 5000 被 ntpd 强制解除?是不是flask的问题?

最佳答案

ntpd 本身并不监听 TCP 端口 5000,而是监听它运行的环境 - 进程。

该进程是 Flask 服务器进程的子进程,它打开一个监听 TCP 端口 5000 的套接字。

这个套接字是在子进程中继承的,并且由于 ntpd 进程是一个长期运行的进程,因此它会使用从您继承的套接字继续运行,并占用端口 5000。

检查how to deal with Python BaseHTTPServer killed,but the port is still be occupied?关于如何防止子进程继承套接字。

当然,首先你得找到一种方法来定制 Flask 启动服务器的方式。

关于python Flask 服务器端口被 ntpd 取消强制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34986308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com