退出 control-D 上的子进程?

Exiting subprocess on control-D?

我试图在父进程被 cntrl-D(标准输入上的 EOF)杀死时停止作为子进程的服务器。我尝试了很多方法,包括在子进程中读取标准输入,但这会阻止所有键盘输入。有没有办法在父进程遇到EOF的时候杀掉子进程

通过 subprocess.Popen

在 python 中创建子进程

通过以下方式轮询子进程中的 EOF:

self.t = threading.Thread(target=self.server.serve_forever)
self.t.start()
# quit on cntrl-d (EOF)
while True:
    if len(sys.stdin.readline()) == 0:
        self.stop()

def stop(self):
    manager.save()
    # shutdown bottle
    self.server.shutdown()
    # close socket
    self.server.server_close()
    self.t.join()
    sys.exit()

根据@thatotherguy 关于使用 os.getppid() 的建议,这是在子进程被父进程孤立时结束子进程的新工作解决方案(即当 control-D 出现在parent 并且它在不向 child 发出信号的情况下关闭)

self.t = threading.Thread(target=self.server.serve_forever)
self.t.start()
# quit on cntrl-d (EOF)
if os.getppid() != 1:
    while True:
        if os.getppid() == 1:
            self.stop()
        else:
            time.sleep(1)