在Linux上使用Python从子进程中杀死父进程

时间:2018-07-12 12:34:34

标签: python linux python-2.7 multiprocessing fork

在我的场景(非常简化)中,在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()等待子进程完成,但就我而言,父进程是执行任务的人,因此不应等待为它的孩子。

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

1 个答案:

答案 0 :(得分: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)