4

我在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

谢谢你!

4

4 回答 4

2

您可以使用该psutil库来获取进程的 cpu 百分比并最终杀死它们。这个库在 32 位和 64 位的 Linux、Windows、Solaris、FreeBSD 和 OS X 上与 python 2.4 到 3.3(和 PyPy)一起工作。

以下(未经测试的)代码应该做你想做的事:

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,但仅在最后几秒钟内。

于 2013-08-27T09:59:46.347 回答
1
import os

os.system(' ps aux| grep gnome-panel | awk \'{if($3>80) print $2}\' |xargs kill -9 ') 
于 2013-08-27T09:03:01.507 回答
0

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

于 2013-08-27T08:25:17.963 回答
0

看起来这已经在这里实现以获得 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]])

我敢肯定有一种不那么老套的方法来做到这一点

于 2013-08-27T08:42:12.157 回答