【问题标题】:How to kill all processes of a Python program?如何杀死Python程序的所有进程?
【发布时间】:2020-06-29 23:27:35
【问题描述】:

我正在运行一个 Python 程序 service_host.py,它启动了多个进程。当我使用ps -ef | grep python

检查 pid,它显示了很多:

congmin  26968 22897  0 Jun20 ?        00:00:00 python service_host.py
congmin  26969 22897  0 Jun20 ?        00:00:00 python service_host.py
congmin  26970 22897  0 Jun20 ?        00:00:00 python service_host.py
congmin  26971 22897  0 Jun20 ?        00:00:00 python service_host.py
congmin  26972 22897  0 Jun20 ?        00:00:00 python service_host.py
congmin  26973 22897  0 Jun20 ?        00:00:00 python service_host.py
congmin  26974 22897  0 Jun20 ?        00:00:00 python service_host.py
congmin  26975 22897  0 Jun20 ?        00:00:00 python service_host.py

一次杀死所有这些进程的最佳方法是什么?我在Linux上,不想通过进程ID一一杀死。有没有办法通过 Python 名称“service_host.py”杀死它们?我试过了,但它根本没有杀死:

import psutil

PROCNAME = "service_host.py"

for proc in psutil.process_iter():
    # check whether the process name matches
    if proc.name() == PROCNAME:
        proc.kill()

是否有可以轻松完成这项工作的终端命令?

【问题讨论】:

  • 在 shell pkill python ?
  • 我不想杀死所有 python 进程。仅与名称“service_host.py”相关的那些
  • 然后试试pkill service_host.py 或者pkill -e 'python service_host.py'
  • 不,它根本不会杀人。
  • pkill -f 'service_host.py'。这可以完成工作。谢谢。

标签: python process pid kill-process sigkill


【解决方案1】:

Linux 有命令 pkill 按名称杀死

pkill python

精确匹配

pkill -e 'python service_host.py'

签入全名

pkill -f 'service_host.py'

更多内容在man pkill

顺便说一句:还有pgrep可以使用名称获取PID。

【讨论】:

    【解决方案2】:

    您已将其标记为“python”,并且您的脚本接近于做正确的事情,因此这是您脚本的固定版本——使用cmdline 方法将命令行提取为列表:

    import psutil
    
    PROCNAME = "service_host.py"
    
    for proc in psutil.process_iter():
        # check whether the process name matches
        cmdline = proc.cmdline()
        if len(cmdline) >= 2 and "python" in cmdline[0] and cmdline[1] == PROCNAME:
            # print(proc)
            proc.kill()
    

    尽管来自 Linux 命令行的各种可能性当然是可能的。

    kill `ps -ef | grep "python service_host.py" | grep -v grep | awk '{print $2}'`
    

    或者其他...

    【讨论】:

      【解决方案3】:

      改用htop,您将能够使用F4 过滤进程service_host,并使用F5 查看整个树。从那里您可以使用F9 一次性kill 他们...

      遵循以下简单的 3 个步骤:

      1. 输入htop
        • 可选F4并输入service_host过滤要杀死的进程
        • 可选F5 将进程排序为树。这会将子进程组织到其主进程 ID (PID)
      2. 滚动列表并突出显示要终止的进程,然后按F9 选择终止选项
      3. 高亮15 SIGTERM(信号终止)优雅地请求停止进程或9 SIGKILL(信号终止)强行关闭进程并最后按回车

      我通常会选择9 SIGKILL 而不必担心太多,但这取决于你和你在 python 脚本中所做的事情!

      【讨论】:

      • 具体怎么做?先 htop,再按 f4,然后按 f5?
      • 是的,htop 就像更熟悉的 top 命令一样,但并不总是在那里,无论如何这肯定是一个很好的机会得到它sudo apt-get install htop 然后你会发现它非常在这种情况下很有用。无论如何,top 应该也可以工作,查找进程,然后按 k 键杀死该 PID,这对于所有子进程应该是唯一的;)
      • 无论如何,你必须关注these steps我只是在上面总结,编辑我的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-02
      • 1970-01-01
      • 2013-05-03
      • 2010-12-08
      相关资源
      最近更新 更多