由ntpd强制执行的python flask服务器端口

时间:2016-01-25 06:23:29

标签: python flask port ntpd

我有一个由python和flask实现的休息服务器。并实现 api 以重新启动void work() { // assume m_id is 0,1,2,... int curindex = m_id; while (m_parent->m_running) { if (curindex >= max_index) break; Task *task = m_parent->m_in[curindex]; task->execute(); curindex += NUMBER_OF_WORKERS; } }
代码test_flask.py:

ntpd

然后我按照以下方式操作:

  1. 启动flask服务器:python test_flask.py
  2. curl" http://localhost:5000/restart_ntpd。然后ntpd重启&返回"成功"
  3. 停止烧瓶服务器:只需使用Ctrl + c停止
  4. 再次启动flask服务器,它将引发异常:
      

    socket.error:[Errno 98]地址已被使用。

  5. 使用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() ,端口由sh $ netstat -ntlp | grep 5000
  6. 强制执行

    我认为默认情况下ntpd将使用端口123 。在我的场景中,为什么端口5000 ntpd强制执行?这是烧瓶的问题吗?

1 个答案:

答案 0 :(得分:1)

ntpd没有侦听TCP端口5000本身,而是它正在运行的环境 - 这个过程。

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

此套接字在子进程中继承,并且由于ntpd进程是一个长时间运行的进程,它继续运行它继承自你的套接字,占用端口5000.

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

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