2012-07-23 87 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)