2016-07-27 42 views
0

我试图停止一个服务器,当父进程被一个cntrl-D(stdin上的EOF)杀死时,这是一个子进程。我尝试了很多方法,包括读取子进程中的stdin,但会阻止所有键盘输入。当父进程遇到EOF时,是否有办法终止子进程?在控制-D上退出子进程?

这个创建通过subprocess.Popen

轮询的子EOF Python中的子:

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() 
+0

让父母处理给孩子一个信号,表示该退出了。 –

+0

@thatotherguy当用户用控件-d强制退出父进程时不起作用,那里没有信号传播。 –

+0

Ctrl-D不是强制退出。在你的代码片段中,你似乎已经明确地编码以检测eof并因为而退出。只要发信号通知小孩,它应该作为其中的一部分退出。与Python的线程事件。 –

回答

0

使用os.getppid()的@thatotherguy的建议,这里是新工作的解决方案当它由父母孤儿时结束子过程(即,当父母发生控制-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)