【问题标题】:Using Python os.execl* replace self process使用 Python os.execl* 替换自身进程
【发布时间】:2012-07-23 08:05:04
【问题描述】:

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

【问题讨论】:

  • 你不能在调用exec之前简单地释放所有资源(例如关闭套接字和文件等)吗?

标签: python process web2py


【解决方案1】:

os.execl 正在替换当前进程,但它保留了打开的端口; “端口正在被另一个进程使用”的错误信息不正确,它实际上正在被当前进程使用。

在 Unix 上,打开的文件描述符通过调用 exec 继承,除非 fd 用 FD_CLOEXEC 标记为 close-on-exec。这在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)

【讨论】:

    猜你喜欢
    • 2018-05-30
    • 2014-03-05
    • 2014-12-02
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 2018-11-14
    • 2017-01-06
    相关资源
    最近更新 更多