首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止Django进程产生的websockify进程在重启Django服务器时被杀死?

如何防止Django进程产生的websockify进程在重启Django服务器时被杀死?
EN

Stack Overflow用户
提问于 2020-08-27 06:48:22
回答 1查看 95关注 0票数 0

请注意,Django服务器是Daphne,但websockify命令与Daphne通道无关。

我在Django视图中有以下过于简化的代码:

代码语言:javascript
复制
def openvnc_connection(request):
    Popen(['websockify'. "--run-once", "--daemon", "--timeout", "30", "--idle-timeout", "60", "--cert", ...])
    ...

问题是,当我部署代码时,涉及重启Daphne worker服务,websockify进程也被终止,导致任何活动的vnc连接被丢弃。

我知道websockify进程是django进程的子进程,因此它会被终止。

我尝试过分离子进程之类的double-forksimilar stuff,但它们似乎不起作用,并且在重启Daphne worker时websockify进程仍然会被终止。

尝试了double fork:

代码语言:javascript
复制
def spawnDaemon(port, target):
    import os, sys, subprocess
    # do the UNIX double-fork magic, see Stevens' "Advanced
    # Programming in the UNIX Environment" for details (ISBN 0201563177)
    try:
        pid = os.fork()
        if pid > 0:
            # parent process, return and keep running
            return
    except Exception as e:
        print(sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror))
        sys.exit(1)

    os.setsid()

    # do second fork
    try:
        pid = os.fork()
        if pid > 0:
            # exit from second parent
            sys.exit(0)
    except Exception as e:
        print(sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror))
        sys.exit(1)

    # do stuff
    Popen(['websockify'. "--run-once", "--daemon", "--timeout", "30", "--idle-timeout", "60", "--cert", ...])

    # all done
    os._exit(os.EX_OK)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-28 11:15:35

所以..。我走了一个很大的弯路,试图通过另一个执行双分支的python代码来生成websockify:

代码语言:javascript
复制
def double_fork():
    try:
        pid = os.fork()
        if pid > 0:
            # parent process, return and keep running
            return
    except Exception as e:
        sys.exit(1)

    os.setsid()

    # do second fork
    try:
        pid = os.fork()
        if pid > 0:
            # exit from second parent
            sys.exit(0)
    except Exception as e:
        logger.error("fork #2 failed: %d (%s)" % (e.errno, e.strerror))
        sys.exit(1)

    from websockify.websocketproxy import WebSocketProxy, LibProxyServer
    WebSocketProxy(run_once=True, timeout=30, idle_timeout=60, target_host=sys.argv[1], target_port=sys.argv[2], listen_port=sys.argv[3],
            cert=cert, key=key, daemon=False).start_server()

这使得我能够很好地执行双分支,但当我运行sudo systemctl restart ...时仍然会被杀死,然后进一步搜索发现了这个answer,它对我来说很有效,只需要添加到服务块中。

代码语言:javascript
复制
KillMode=process

然后我也尝试在没有新的python脚本的情况下加倍派生,通过只调用旧的Popen(...),我相信它也会产生一个守护进程,并且它也可以工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63606766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档