【问题标题】:how to kill process and child processes from python?如何从python杀死进程和子进程?
【发布时间】:2011-09-26 20:08:40
【问题描述】:

例如来自 bash:

杀死 -9 -PID

os.kill(pid, signal.SIGKILL) 只杀死父进程。

【问题讨论】:

  • 您实际运行了哪些代码来解决您的问题?
  • 您是否也想杀死父进程...我假设只是子进程对吗?

标签: python


【解决方案1】:

如果父进程不是“进程组”但你想和子进程一起杀掉它,你可以使用 psutil (https://psutil.readthedocs.io/en/latest/#processes)。 os.killpg 无法识别非进程组的 pid。

import psutil

parent_pid = 30437   # my example
parent = psutil.Process(parent_pid)
for child in parent.children(recursive=True):  # or parent.children() for recursive=False
    child.kill()
parent.kill()

【讨论】:

  • 什么是进程组,为什么需要这样做?
  • 很好的答案。我有一个用例,killpg 会杀死我当前进程所在的进程组,这将终止整个程序。
【解决方案2】:

当您将 negative PID 传递给kill 时,它实际上通过该(绝对)数字将信号发送到进程 group。您可以在 Python 中使用 os.killpg() 进行等效操作。

【讨论】:

  • os.killpg() 在 Windows 上不可用
  • 你能提供实际代码以便我可以杀死子进程吗?你的回答对我没有任何意义。
  • @CharlieParker,使用kill -9 -17351 杀死一个组进程而不是kill -9 17351 仅杀死父进程。 stackoverflow.com/questions/392022/…
【解决方案3】:

如果您的进程不是进程组并且您不想使用 psutil,另一种解决方案是运行以​​下 shell 命令:

pkill -TERM -P 12345

例如

os.system('pkill -TERM -P {pid}'.format(pid=12345))

【讨论】:

    【解决方案4】:

    没有一个答案可以帮助我,所以我做了一些研究并写下了我的答案: 您可以使用os 模块轻松完成此操作,但它对平台敏感。这意味着有些命令仅在 Unix 上可用,有些则在任何平台上可用。 所以我的项目在不同的地方和时间启动了一个进程,以及几个子进程。一些子进程启动了子进程:) 所以我找到了这个解决方案:

    import os
    import signal
    import platform
    # get the current PID for safe terminate server if needed:
    PID = os.getpid()
    if platform.system() is not 'Windows':
        PGID = os.getpgid(PID)
    if platform.system() is not 'Windows':
        os.killpg(PGID, signal.SIGKILL)
    else:
        os.kill(PID, signal.SIGTERM)
    

    我在 Linux 上使用 SIGKILL 来立即终止进程,在 Windows 上使用 SIGTERM,因为上面没有 SIGKILL。 我还使用killpg() 杀死了Linux 上的整个进程组。

    附:在 Linux 上检查,但在 Windows 上仍然不检查,所以也许我们需要针对 Windows 的其他命令(例如 CTRL_C_EVENT 或 use another answer。)

    【讨论】:

      【解决方案5】:

      您应该使用信号参数 9 来终止进程树。

      root@localhost:~$ python
      >>> import os
      >>> os.kill(pid, 9)
      

      如果你应该使用signal.SIGKILL constant,你应该使用os.killpg(pgid, signal.SIGKILL)来杀死进程树。

      【讨论】:

      • os.kill(pid,9) 为我工作,我在 centos 5.6 上使用 python 2.7
      • 是的,os.kill(pid, 9)signal.SIGKILL 恰好是9 时起作用,这在大多数平台上都存在。尽管如此,signal.SIGKILL 是正确使用的常量,使用 9 代替 signal.SIGKILL 并不是一种改进,也不能以任何方式解决 OP 的问题。
      • 你是对的,如果你必须使用signal.SIGKILL常量,你应该使用os.killpg(pgid, signal.SIGKILL)来杀死一个组进程。
      【解决方案6】:

      我不知道这是否是您要求的,但如果您希望终止应用程序的其他进程并且它们都是使用多处理包创建的,您可以执行以下操作:

      import multiprocessing
      from time import sleep
      
      ...
      
      def on_shutdown():
          for child in multiprocessing.active_children():
              print('Terminating', child)
              child.terminate()
              sleep(0.5)
      

      【讨论】:

        猜你喜欢
        • 2010-12-08
        • 1970-01-01
        • 1970-01-01
        • 2014-06-19
        • 1970-01-01
        • 1970-01-01
        • 2013-01-03
        • 2011-09-23
        相关资源
        最近更新 更多