如何强制 pty.spawn() 启动的应用程序干净退出?
How to force a pty.spawn() launched application to cleanly exit?
我正在开发一个简单的服务,它绑定到一个端口并为一个应用程序生成一个 pty,dup()
ing STDIN
、STDOUT
和 STDERR
到套接字,以便套接字控制 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()
ed 应用程序吗?
您可以像这样wait()退出进程:
pty.spawn("cmd") # it returns nothing
os.wait()
您还可以设置一个 SIGCHLD 处理程序,这样退出的子进程可以自动 waited。
def sig_child(signum, bt):
os.waitpid(-1, os.WNOHANG)
signal.signal(SIGCHLD, sig_child)
pty.spawn("cmd")
我正在开发一个简单的服务,它绑定到一个端口并为一个应用程序生成一个 pty,dup()
ing STDIN
、STDOUT
和 STDERR
到套接字,以便套接字控制 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()
ed 应用程序吗?
您可以像这样wait()退出进程:
pty.spawn("cmd") # it returns nothing
os.wait()
您还可以设置一个 SIGCHLD 处理程序,这样退出的子进程可以自动 waited。
def sig_child(signum, bt):
os.waitpid(-1, os.WNOHANG)
signal.signal(SIGCHLD, sig_child)
pty.spawn("cmd")