首页 > 解决方案 > 在 Linux 上使用 Python 从子进程中杀死父进程

问题描述

在我的(非常简化的)场景中,在 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(),但在我的情况下,父进程是执行任务的人,它不应该等待它的子进程。

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

标签: pythonlinuxpython-2.7multiprocessingfork

解决方案


您可以使用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)

推荐阅读