我想用不同的参数替换自我进程(运行web2py),例如使用Python os.execl *函数绑定ip地址。虽然替换我发现的实例是成功的,但实际上并没有杀死原始进程,只是创建了一个新的子进程。例如,原始web2py进程在10.1.1.1:8000上运行。然后在页面的控制器中运行,
os.execl('python', 'python', 'web2py.py', '--ip=10.1.1.2', '--port=8000', '--password=')
好的,我们现在可以在10.1.1.2:8000打开网页。但是如果我们再次在同一个过程中改回10.1.1.1:8000。新流程抱怨端口已被其他流程使用。
他自己有另一种“刷新”web2py服务的方法吗?
答案 0 :(得分:1)
os.execl
正在取代当前流程,但它保留了开放端口; “端口正由另一个进程使用”的错误消息不正确,它实际上正被当前进程使用。
在Unix上,打开文件描述符是在exec
的调用中继承的,除非fd被标记为close-on-exec FD_CLOEXEC
。这在http://bugs.python.org/issue12107处被视为问题。
在重新执行进程之前,您应该告诉web2py关闭端口,或者使用fcntl
模块将fd标记为close-on-exec:
fcntl.fcntl(socket, fcntl.F_SETFD, fcntl.fcntl(socket, fcntl.F_GETFD) | fcntl.FD_CLOEXEC)