【问题标题】:Exiting subprocess on control-D?在 control-D 上退出子进程?
【发布时间】:2016-07-27 16:47:18
【问题描述】:

当父进程被 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 当用户用 control-d 强行退出父进程时不起作用,那里没有信号传播。
  • Ctrl-D 不是强制退出。在您的 sn-p 中,您似乎已明确编码以检测 eof 并退出,因为。只需向孩子发出信号,它应该作为其中的一部分退出,例如使用 Python 的线程事件。
  • @thatotherguy 上面的代码在子进程中。我无权访问父进程。我正在尝试检测父进程中发生的 control-D,以便我可以在子进程中使用 stop() 处理它
  • 啊。处理这个是父进程的工作,但由于它作为父进程失败了,你可以例如循环直到os.getppid()为1,表示父进程已经退出,你已经被重新分配给init了。

标签: python linux subprocess


【解决方案1】:

@thatotherguy 建议使用 os.getppid(),这是在子进程被父进程孤立时结束子进程的新工作解决方案(即,当父进程上发生 control-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)

【讨论】:

    猜你喜欢
    • 2015-10-20
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 2015-09-13
    • 2021-10-30
    相关资源
    最近更新 更多