2012-07-23 85 views
0

我想用不同的参数(如使用Python os.execl *函数绑定IP地址)替换自我进程(运行web2py)。虽然成功地替换了我发现的实例,但它并没有杀死原始进程,而只创建了一个新的子进程。例如,原始web2py进程在10.1.1.1:8000上运行。然后,在页面的控制器运行,使用Python os.execl *替换自我处理

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

不能你只是释放所有资源(例如关闭套接字和文件等)在调用exec之前? – 2012-07-23 08:10:34

回答

1

os.execl正在取代当前进程,但它保留了开放端口; “该端口正在被另一个进程使用”的错误消息不正确,它实际上正在由当前进程使用。

在Unix上,通过调用exec来继承打开的文件描述符,除非fd用FD_CLOEXEC标记为close-on-exec。这在http://bugs.python.org/issue12107处被记录为一个问题。

你应该告诉web2py的接近-ON-EXEC重新execing的过程之前,关闭端口,或标记FD用fcntl模块:

fcntl.fcntl(socket, fcntl.F_SETFD, fcntl.fcntl(socket, fcntl.F_GETFD) | fcntl.FD_CLOEXEC)