使用Python os.execl *替换自我进程

时间:2012-07-23 08:05:05

标签: python process web2py

我想用不同的参数替换自我进程(运行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服务的方法吗?

1 个答案:

答案 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)