请注意,Django服务器是Daphne,但websockify命令与Daphne通道无关。
我在Django视图中有以下过于简化的代码:
def openvnc_connection(request):
Popen(['websockify'. "--run-once", "--daemon", "--timeout", "30", "--idle-timeout", "60", "--cert", ...])
...问题是,当我部署代码时,涉及重启Daphne worker服务,websockify进程也被终止,导致任何活动的vnc连接被丢弃。
我知道websockify进程是django进程的子进程,因此它会被终止。
我尝试过分离子进程之类的double-fork或similar stuff,但它们似乎不起作用,并且在重启Daphne worker时websockify进程仍然会被终止。
尝试了double fork:
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)发布于 2020-08-28 11:15:35
所以..。我走了一个很大的弯路,试图通过另一个执行双分支的python代码来生成websockify:
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,它对我来说很有效,只需要添加到服务块中。
KillMode=process然后我也尝试在没有新的python脚本的情况下加倍派生,通过只调用旧的Popen(...),我相信它也会产生一个守护进程,并且它也可以工作。
https://stackoverflow.com/questions/63606766
复制相似问题