【问题标题】:how do I get the process list in Python?如何在 Python 中获取进程列表?
【发布时间】:2020-08-15 21:05:33
【问题描述】:

如何在 Unix 上从 Python 获取所有正在运行的进程的进程列表,其中包含命令/进程的名称和进程 ID,以便我可以过滤和终止进程。

【问题讨论】:

  • 您是否过滤了进程名称中的任何特定内容?还是只过滤与进程名称匹配的进程 ID?
  • 我需要匹配 Darwin Streaming Server 中没有任何当前侦听器的流会话,以及提供流的进程。有人提到 pgrep/pkill 也很有用,但我想我会使用 krawyoti 并从 python 执行 os.kill,我只是更喜欢编写 python 代码然后使用 shell 命令。

标签: python unix kill ps processlist


【解决方案1】:

Python 中正确的可移植解决方案是使用psutil。您有不同的 API 与 PID 交互:

>>> import psutil
>>> psutil.pids()
[1, 2, 3, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, ..., 32498]
>>> psutil.pid_exists(32498)
True
>>> p = psutil.Process(32498)
>>> p.name()
'python'
>>> p.cmdline()
['python', 'script.py']
>>> p.terminate()
>>> p.wait()

...如果你想“搜索并杀死”:

for p in psutil.process_iter():
    if 'nginx' in p.name() or 'nginx' in ' '.join(p.cmdline()):
        p.terminate()
        p.wait()

【讨论】:

    【解决方案2】:

    在 Linux 上,使用包含 subprocess 模块的最新 Python:

    from subprocess import Popen, PIPE
    
    process = Popen(['ps', '-eo' ,'pid,args'], stdout=PIPE, stderr=PIPE)
    stdout, notused = process.communicate()
    for line in stdout.splitlines():
        pid, cmdline = line.split(' ', 1)
        #Do whatever filtering and processing is needed
    

    您可能需要根据您的具体需要稍微调整 ps 命令。

    【讨论】:

    • “最近的 Python”是什么意思? 2.7 ? 3.0 ? 3.8 ?
    • @Itération122442 这意味着最近足以包含 subprocess 模块 - 所以 2.4-2.7、3.5+。
    【解决方案3】:

    在 linux 上,最简单的解决方案可能是使用外部的ps 命令:

    >>> import os
    >>> data = [(int(p), c) for p, c in [x.rstrip('\n').split(' ', 1) \
    ...        for x in os.popen('ps h -eo pid:1,command')]]
    

    在其他系统上,您可能需要将选项更改为 ps

    不过,您可能希望在 pgreppkill 上运行 man

    【讨论】:

    • pgrep/pkill 看起来是我需要的一个很好的解决方案(至少这次)。我一直错过 Python 中内置的 ps 函数,所以这就是我发布这个问题的部分原因。干杯
    • os.popen 已弃用。使用子流程模块。
    • 嗯,这很有趣。这本身就值得一个问题:stackoverflow.com/questions/1098257
    【解决方案4】:

    安装psutil:

    $pip install psutil
    

    导入psutil:

    >>> import psutil
    

    定义要保存进程列表的列表:

    >>> processlist=list()
    

    在列表中追加进程:

    >>> for process in psutil.process_iter():
            processlist.append(process.name())
    

    获取进程列表:

    >>> print(processlist)
    

    完整代码:

    import psutil
    processlist=list()
    for process in psutil.process_iter():
        processlist.append(process.name())
    print(processlist)
    

    【讨论】:

      【解决方案5】:

      为什么选择 Python?
      进程名上可以直接使用killall

      【讨论】:

      • 他说他会过滤然后杀死
      • 很好的观察,但是为什么要过滤命令名称的ps 输出,收集进程ID 值然后杀死,当killall 为你做呢?
      • 因为我需要将流程与其他数据进行匹配。
      • 我保留了这个答案,因为它强调了对 ithin-python 解决方案的需求。这个问题不需要kill 部分;可以很简单,how do I get the process list in Python?
      猜你喜欢
      • 2012-10-23
      • 2023-03-05
      • 2014-05-29
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      相关资源
      最近更新 更多