python flask服务器端口已被ntpd解除强制

python flask服务器端口已被ntpd解除强制,python,flask,port,ntpd,Python,Flask,Port,Ntpd,我有一个rest服务器,由python和flask实现。并实现一个api来重新启动ntpd代码测试_flask.py: 然后我按如下方式操作: 启动flask服务器:python test_flask.py 然后ntpd重新启动并返回“成功” 停止flask服务器:只需使用Ctrl+c停止 再次启动flask服务器,它将引发异常: socket.error:[Errno 98]地址已在使用中 使用sh$netstat-ntlp | grep 5000,端口被ntpd 我认为默认情况下,ntpd

我有一个rest服务器,由python和flask实现。并实现一个api来重新启动
ntpd

代码测试_flask.py:

然后我按如下方式操作:

  • 启动flask服务器:python test_flask.py
  • 然后ntpd重新启动并返回“成功”
  • 停止flask服务器:只需使用Ctrl+c停止
  • 再次启动flask服务器,它将引发异常: socket.error:[Errno 98]地址已在使用中

  • 使用
    sh$netstat-ntlp | grep 5000
    ,端口被
    ntpd

  • 我认为默认情况下,
    ntpd
    将使用端口123。在我的场景中,为什么端口5000被
    ntpd
    禁用?是不是烧瓶的问题?

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

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

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

    检查如何防止子进程继承套接字


    当然,首先您必须找到一种方法来定制启动服务器的方式。

    您运行的'curl'cmd的响应是什么?除此之外,有时即使在各个进程停止后,关闭打开的tcp端口也需要一分钟以上的时间。'curl'将返回'success'并重新启动ntp服务器。请等待很长时间,端口仍会被禁用ntpd
    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()