我想让Flask调用一个独立的C ++进程,并且Flask应该继续运行。 它启动了c ++进程,如果我杀死Flask,它将继续运行(良好)。 我的问题是,如果我重新启动Flask,它将说正在使用的端口正在运行,而我无法重新启动。因此,似乎该过程仍以某种方式与Flask有关。如何避免这种情况? 谢谢
import os
pid=os.fork()
if pid==0: # new process
os.system("nohup /path/myc++ &")
Launch a completely independent process
错误:
sudo python server.py
* Serving Flask app "server" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: on
Traceback (most recent call last):
File "server.py", line 1046, in <module>
app.run(debug=True, use_reloader=True)
File "/home/user/.local/lib/python2.7/site-packages/flask/app.py", line 943, in run
run_simple(host, port, self, **options)
File "/home/user/.local/lib/python2.7/site-packages/werkzeug/serving.py", line 795, in run_simple
s.bind(get_sockaddr(hostname, port, address_family))
File "/usr/lib/python2.7/socket.py", line 228, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 98] Address already in use
答案 0 :(得分:0)
这是因为您的子进程(myc ++)在fork()
调用之后从父级(Flask)继承了所有文件打开的描述符(包括套接字)。当父进程退出时,这些描述符保留在打开的统计信息中,并且在下次启动时,Flask将无法在已经打开的端口上绑定套接字。
在派生之后,在子进程中,必须先关闭父文件描述符,然后再启动system()
命令。
您应该尝试以下代码:
import os
pid=os.fork()
if pid==0: # new process
for fd in xrange(0, 1024):
try:
os.close(fd)
except OSError:
pass
os.system("nohup /path/myc++ &")