我有一个用烧瓶用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
卷曲“ http://localhost:5000/restart_ntpd。然后ntpd重新启动并返回”成功“
停止烧瓶服务器:只需使用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。

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

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

关于python - ntpd阻止的python flask服务器端口,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34986308/

10-12 17:42