0

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

4

1 回答 1

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)
于 2012-07-23T09:47:34.187 回答