在控制-D上退出子进程?

时间:2016-07-27 16:47:18

标签: python linux subprocess

我正在尝试停止服务器,当父进程被cntrl-D(stdin上的EOF)杀死时,这是一个子进程。我尝试了很多方法,包括在子进程中读取stdin但阻止所有键盘输入。有没有办法在父进程遇到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()

1 个答案:

答案 0 :(得分:0)

使用@thatotherguy建议使用os.getppid(),这是一个新的工作解决方案,用于在父进程孤立时终止子进程(即,当父进程出现控制-D时)并且在没有发信号通知孩子的情况下关闭)

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)