Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在linux上用python在给定时间内使用%cpu终止特定进程?_Python_Linux_Time_Cpu_Kill - Fatal编程技术网

如何在linux上用python在给定时间内使用%cpu终止特定进程?

如何在linux上用python在给定时间内使用%cpu终止特定进程?,python,linux,time,cpu,kill,Python,Linux,Time,Cpu,Kill,我在linux上用python编写了这个脚本,它在本地部署vnc,在这个vnc屏幕上执行一些图形化工作,并终止vnc。有时在作业完成后,名为gnome的进程会挂起并保持100%的cpu使用率。然后,我需要通过putty登录并手动终止所有这些进程(实际上有时会有很多进程)。我想在python脚本完成任务时添加几行代码,这不仅会杀死vnc(它已经这么做了),而且如果gnome面板在给定的时间段内消耗一定数量的cpu,它也会杀死它。我不能简单地杀死所有的gnome面板,因为其中一些面板工作得很好(我同

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

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

如果进程名为gnome panel,占用超过80%的cpu,并且运行时间超过1分钟,则终止进程id


谢谢大家!

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

看起来这已经实现了,以获得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百分比,并最终杀死它们。该库在Linux、Windows、Solaris、FreeBSD和OS X上(32位和64位)使用2.4到3.3(和PyPy)的python

import os

os.system(' ps aux| grep gnome-panel | awk \'{if($3>80) print $2}\' |xargs kill -9 ') 
以下(未经测试)代码应满足您的要求:

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()

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

它是否也考虑了时间?您希望如何考虑时间?o好的,我明白您的意思阅读此问题,我认为您上次检查的时间不正确。您不应该检查进程是否在一分钟前启动,以及它的CPU百分比,而是检查进程在最后一分钟是否总是使用超过80%的CPU。为了做到这一点,您必须以一定的间隔调用
ps aux
,持续一分钟。我确信,如果进程在1分钟后仍然存在,并且在检查过程中仍使用了80%以上的数据,我希望终止进程。我希望这个代码片段是最简单、最快的解决方案。我可以运行一些cpu使用率监视器之类的,但它仍然消耗了太多的资源。只运行一次(例如,在启动或关闭VNC时)并查看cpu>80%时间>1分钟是否更容易。如果我错了,请纠正我。这需要时间来考虑。如果我想使用cron作业,这可能是答案(让我们试试)。您能否在此条件中添加时间考虑因素(流程必须工作超过1分钟)?ps aux | grep‘gnome panel’| awk{if($3>80)print$2}’| xargs kill-9For“消耗超过80%的cpu并运行超过1分钟”您的意思是进程在一分钟前启动,此时消耗超过80%的cpu,还是在最后一分钟它总是使用超过80%的cpu?“进程在一分钟前启动,此时占用了80%以上的cpu“这是正确的,这应该是我需要的,让我测试一下,我无法测试。”。由于某些错误,我无法添加psutil模块。我已经安装了python-devel并尝试了easy\u-install,但它不起作用。psutil/_psutil_linux.c:在函数“init_psutil_linux”中:psutil/_psutil_linux.c:418:错误:“RLIMIT_RTTIME”未声明(首次在此函数中使用)@orsz奇怪。我安装它从来没有遇到过问题。如果您在ubuntu上,您可以使用软件包管理器安装它(搜索
pythonpsutil
python3psutil
)。您可以尝试从源代码处安装它(只需解包并启动
python setup.py install
,最终使用
sudo
).Im在centos上,但yum install python psutil有帮助:),它可能会按预期工作,因为我看不到僵尸进程-问题已解决,谢谢
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()