如何强制pty.spawn()启动的应用程序干净地退出?

时间:2017-08-02 22:28:28

标签: python pty

我正在开发一个绑定到端口并为应用程序生成pty的简单服务,dup() STDINSTDOUTSTDERR到套接字,以便套接字控制pty

prevOutFd = os.dup(1)
prevInFd = os.dup(0)
prevErrFd = os.dup(2)
while 1:
    #wait to accept a connection - blocking call
    conn, addr = s.accept()
    logging.info('Connected with ' + addr[0] + ':' + str(addr[1]))
    # redirect stdout, stdin and stderr to socket fd
    os.dup2(conn.fileno(),0)
    os.dup2(conn.fileno(),1)
    os.dup2(conn.fileno(),2)
    p=pty.spawn("/usr/sbin/pppd")
    # redirect stdout, stdin and stderr back to original fds
    os.dup2(prevOutFd, 0)
    os.dup2(prevInFd, 1)
    os.dup2(prevErrFd, 2)
    logging.info("Closing connection....")
    conn.close()

除非客户端突然终止连接,否则此工作正常。 服务器处理得很好,但生成的应用程序在系统中保持不动:

root 9820 0.1 0.0 0 0 ? Zs 16:19 0:00 [pppd] <defunct>

我认为解决方案是等待应用程序完成或干净地关闭它。 但是,pty似乎没有某种close()方法。

任何人都知道如何干净地关闭pty.spawn()应用程序?

1 个答案:

答案 0 :(得分:0)

你可以wait()这样的退出流程:

pty.spawn("cmd")    # it returns nothing
os.wait()

您还可以设置SIGCHLD处理程序,以便退出的子进程可以自动等待

def sig_child(signum, bt):
    os.waitpid(-1, os.WNOHANG)

signal.signal(SIGCHLD, sig_child)

pty.spawn("cmd")