【问题标题】:Killing parent process from a child process with Python on Linux在 Linux 上使用 Python 从子进程中杀死父进程
【发布时间】:2018-12-20 16:42:26
【问题描述】:

在我的(非常简化的)场景中,在 python 2.7 中,我有 2 个进程:

  1. 父进程,它执行一些任务。
  2. 子进程,X时间后需要杀死父进程。

子进程的创建:

killer = multiprocessing.Process(...)
killer.start()

子进程X时间后执行如下代码(代码简化版):

process = psutil.Process(parent_pid)
...
if time_elapsed:
    while True:
        process.kill()
        if not process.is_alive:
            exit()

问题在于它将父进程作为僵尸进程离开,而子进程永远不会退出,因为父进程还活着。

相同的代码在 Windows 中按预期工作。

我看到的所有解决方案都在谈论通过调用killer.join() 等待子进程完成的父进程,但在我的情况下,父进程是执行任务的人,它不应该等待它孩子。

处理这种情况的最佳方法是什么?

【问题讨论】:

  • 有什么特别的原因为什么您必须终止进程而不是使用threading.event 之类的东西退出它?有什么理由不能仅仅改变父子进程的任务?
  • 在启动流程之前killer.daemon = True 有帮助吗?
  • @JohnAnderson 它没有改变任何东西
  • @Felix 我并不总是使用超时功能,它只是我程序中众多选项之一。在以后的设计中,我可能会使用 threading.event 之类的东西,但现在干掉它对我来说没问题。
  • 如果杀死父母会让父母变成僵尸,那么问题出在祖父母身上。如果父级实际上是僵尸,则祖父级应该等待它从进程表中清除它。

标签: python linux python-2.7 multiprocessing fork


【解决方案1】:

您可以使用os.getppid() 检索父级的PID,并使用os.kill() 将其终止。

例如os.kill(os.getppid(), signal.SIGKILL)

请参阅 https://docs.python.org/2/library/os.htmlhttps://docs.python.org/2/library/signal.html#module-signal 以供参考。

一个mwo:

家长:

import subprocess32 as subprocess

subprocess.run(['python', 'ch.py'])

孩子:

import os
import signal

os.kill(os.getppid(), signal.SIGTERM)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 2020-06-02
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    相关资源
    最近更新 更多