【问题标题】:how to kill specific process using %cpu over given time in python on linux?如何在 Linux 上的 python 中在给定时间内使用 %cpu 杀死特定进程?
【发布时间】:2023-03-24 14:53:01
【问题描述】:

我在linux上的python中有这个脚本,它在本地部署vnc,在这个vnc屏幕上做一些图形工作,然后杀死vnc。有时在工作完成后,名为 gnome-panel 的进程会挂起并保持 100% 的 cpu 使用率。然后我需要通过 putty 登录并手动终止所有这些进程(有时实际上有很多)。我想在我的 python 脚本完成它的工作时添加几行,这不仅会杀死 vnc(它已经这样做了),而且如果它在给定的时间段内消耗一定数量的 cpu,也会杀死 gnome-panel。我不能简单地杀死所有 gnome 面板,因为其中一些工作正常(我同时部署 4 个 vnc 屏幕)。

所以我在 python 中需要这个条件:

如果进程名称是 gnome-panel 并且消耗超过 80% 的 cpu 并且运行时间超过 1 分钟,则杀死进程 id

谢谢!

【问题讨论】:

  • 对于“消耗超过 80% 的 cpu 并运行超过 1 分钟”,您的意思是该进程在超过一分钟前开始,此时消耗超过 80% 的 cpu,或者 在最后一分钟总是使用超过 80% 的 cpu?
  • "进程在一分钟前启动,此时消耗超过 80% cpu" 这是正确的,谢谢

标签: python linux time cpu kill


【解决方案1】:

您可以使用psutil 库来获取进程的cpu 百分比并最终杀死它们。该库适用于 2.4 到 3.3(和 PyPy)的 python,适用于 32 位和 64 位的 Linux、Windows、Solaris、FreeBSD 和 OS X。

以下(未经测试的)代码应该可以满足您的要求:

gnome_panel_procs = []
for process in psutil.process_iter():
    # I assume the gnome-panel processes correctly set their name
    # eventually you could use process.cmdline instead
    if process.name == 'gnome-panel':
        gnome_panel_procs.append(process)

for proc in gnome_panel_procs:
    for _ in range(60):
        # check cpu percentage over 1 second
        if proc.get_cpu_percent(1) < 80 or not proc.is_running():
            # less than 80% of cpu or process terminated
            break
    else:
        # process used 80% of cpu for over 1 minute
        proc.kill()

注意:调用is_running() 可防止pid 重用问题,这可能发生在其他建议的解决方案中(即使机会很小)。


如果要检查进程是否在一分钟前启动,并且此时使用超过 80% 的 CPU,则可以使用更简单的方法:

import time
import psutil

for proc in psutil.process_iter():
    if proc.name == 'gnome-panel' and time.time() - proc.create_time > 1:
        if proc.get_cpu_percent() > 80:
            proc.kill()

这将杀死任何gnome-panel 进程,即使它在最后一分钟并没有使用太多 CPU,但只是在最后几秒钟内。

【讨论】:

  • 这应该是我需要的,让我测试一下
  • 我无法测试它。由于某种错误,我无法添加 psutil 模块。我已经安装了 python-devel 并尝试了 easy_install 但它不起作用。 psutil/_psutil_linux.c: In function ‘init_psutil_linux’: psutil/_psutil_linux.c:418: error: ‘RLIMIT_RTTIME’ undeclared (第一次在这个函数中使用)
  • @orsz 奇怪。我从来没有安装它的问题。如果您在 ubuntu 上,您可以使用包管理器安装它(搜索 python-psutilpython3-psutil)。您可以尝试从源代码安装它(这是解包和启动 python setup.py install 的问题,最终使用 sudo)。
  • 我在 centos 上,但是 yum install python-psutil 帮助了 :) 它可能按预期工作,因为我看不到僵尸进程 - 问题已解决,谢谢
【解决方案2】:
import os

os.system(' ps aux| grep gnome-panel | awk \'{if($3>80) print $2}\' |xargs kill -9 ') 

【讨论】:

    【解决方案3】:

    ps 辅助 | grep 'gnome 面板' | awk '{if ($3>80)print $2}' | xargs 杀死 -9

    【讨论】:

    • 这需要考虑时间
    • 如果我想使用 cron 作业,这可能是答案(让我们试试吧)。您能否在此条件下添加时间考虑(过程必须工作超过 1 分钟)? ps辅助| grep 'gnome 面板' | awk '{if ($3>80)print $2}' | xargs 杀死 -9
    【解决方案4】:

    看起来这已经实现了here 以获得 ps aux 的结果

    ps = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE).communicate()[0]
    processes = ps.split('\n')
    # this specifies the number of splits, so the splitted lines
    # will have (nfields+1) elements
    nfields = len(processes[0].split()) - 1
    processes = [row.split(None, nfields) for row in processes[1:]]
    

    一个示例过程是:

    ['greg', '6359', '0.0', '0.1', '16956', '8868', 'pts/3', 'S+', '01:40', '0:00', 'python']
    

    然后你可以通过循环所有进程来完成

    for process in processes:
        if "gnome-terminal" in process[-1] \
            and float(process[2]) > 0.8 \
                and int(process[-2].split(":")[-1]) > 1: 
            subprocess.call(["kill", "-9", process[0]])
    

    我确信有一种不那么老套的方法来做到这一点

    【讨论】:

    • 是否也需要考虑时间?
    • 您希望如何考虑时间?
    • 好吧,我明白你的意思了
    • 阅读问题我认为您最后一次检查的时间不正确。您不应该检查进程是否在一分钟前启动以及它的 CPU 百分比,而是该进程在最后一分钟是否总是使用超过 80% 的 cpu。为此,您必须每隔一分钟致电ps aux
    • 我确定如果进程在 1 分钟后仍然存在并且在检查期间仍然使用超过 80% 的进程,我想终止它。我希望这段代码 sn-p 成为最简单、最快的解决方案。我可以运行一些 cpu 使用监视器或其他东西,但它仍然消耗太多资源。只运行一次(例如启动或关闭我的 vnc)并查看 cpu > 80% 时间 > 1 分钟更容易。如果我错了,请纠正我......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 2018-12-20
    • 2011-07-06
    相关资源
    最近更新 更多