python flask服务器端口已被ntpd解除强制
我有一个rest服务器,由python和flask实现。并实现一个api来重新启动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
ntpd
代码测试_flask.py: 然后我按如下方式操作:
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()