我有一个由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
然后我按照以下方式操作:
socket.error:[Errno 98]地址已被使用。
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
我认为默认情况下ntpd
将使用端口123 。在我的场景中,为什么端口5000 由ntpd
强制执行?这是烧瓶的问题吗?
答案 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启动服务器的方式。