2013-08-27 55 views
4

我有這個腳本在Linux上的Python本地部署vnc,在這個vnc屏幕上做一些圖形工作,並殺死vnc。有時在作業完成後,名爲gnome-panel的進程掛起並保持100%的CPU使用率。然後我需要通過putty登錄並手動殺死所有這些進程(實際上其中有很多)。我想在完成它的工作時向我的python腳本添加幾行內容,這不僅會殺死vnc(它已經這樣做),而且如果它在給定的時間段內消耗了一定數量的cpu,也會終止gnome-panel。我不能簡單地殺死所有的gnome-panel,因爲其中一些工作正常(同時部署4個vnc屏幕)。如何殺死特定的進程使用%cpu超過給定的時間在Python上的Linux?

所以我需要這個條件在python:

如果進程名是GNOME面板和消耗CPU的80%以上,運行超過1分鐘,殺進程id

謝謝!

+0

對於「消耗超過80%的cpu並運行超過1分鐘」,這意味着該過程是在超過一分鐘前啓動的,並且在此刻消耗超過80%的cpu,或者*在最後一分鐘*它*總是*使用超過80%的CPU? – Bakuriu

+0

「這個過程是在一分鐘前開始的,在這一刻消耗超過80%的CPU」這是正確的,thx – orsz

回答

2

可以使用psutil庫獲得進程的CPU百分比,並最終殺死它們。這個庫適用於Python 2.4到3.3(和PyPy),Linux,Windows,Solaris,FreeBSD和OS X都是32位和64位。

以下(未經測試)的代碼應該做你想要什麼:

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

這將盡管它在最後一分鐘內並沒有使用太多的CPU,但只在最後幾秒鐘內終止了任何gnome-panel進程。

+0

這應該是我所需要的,讓我測試它 – orsz

+0

我無法測試它。由於某種錯誤,我無法添加psutil模塊。我已經安裝python-devel並嘗試easy_install,但它不起作用。 psutil/_psutil_linux.c:在函數「init_psutil_linux」: psutil/_psutil_linux.c:418:錯誤:「RLIMIT_RTTIME」未申報(第一在此函數使用) – orsz

+0

@orsz奇怪。我從來沒有安裝它的問題。如果你在Ubuntu上,你可以使用軟件包管理器來安裝它(搜索'python-psutil'或'python3-psutil')。你可以嘗試從源代碼安裝它(這是解包並啓動'python setup.py install',最終使用'sudo')的問題。 – Bakuriu

0

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

+0

這怎麼能在python中工作? (。py) – orsz

+0

,需要考慮時間 – orsz

+0

如果我想使用cron作業(讓我們試試),這可能是答案。 可否請您將TIME考慮因素(進程必須工作時間超過1分鐘)加入此狀況? ps aux | grep'gnome-panel'| awk'{if($ 3> 80)print $ 2}'| xargs kill -9 – orsz

0

看起來這已經實施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]]) 

我敢肯定,有一個不太好的方法來做到這一點雖然

+0

它是否也需要考慮時間? – orsz

+0

你想如何考慮時間? – Greg

+0

o好吧,我明白你的意思 – Greg

1
import os 

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