Форум сайта python.su
Может есть решение более правильное, но пока такое…
в данном коде определенный процесс , если начинает нагружать процессор, в течении некоторого времени, его убиваем, вопрос : если процесс завершился, то почему начинает жрать ресурсы сам скрипт?
''' config.ini [connect] process = iron.exe cpu = 75 ''' import time import psutil import win32com.client import subprocess wmi=win32com.client.GetObject('winmgmts:') def loadConfig(): import ConfigParser config = ConfigParser.ConfigParser() config.read('config.ini') process = config.get('connect', 'process') cpu = config.get('connect', 'cpu') return {'process':process,'cpu':cpu} config = loadConfig() print config['process'] proc_n = config['process'] numb = int(config['cpu']) while True: for p in wmi.InstancesOf('win32_process'): try: res = p.Properties_('ProcessId') f = psutil.Process(int(res)) if p.Name == proc_n: print p.Name,res , f.get_cpu_percent() if f.get_cpu_percent() > numb: time.sleep(2) if f.get_cpu_percent() > numb: subprocess.Popen('taskkill /PID %d /T /f' % int(res), shell = True) #print p.Name, p.Properties_('ProcessId') except Exception as e: print e.message
Офлайн
Скрипт входит в бесконечный цикл “while True”.
Вам нужно либо выйти из цикла по завершении for (и заверщить программу), либо добавить sleep после каждой итерации.
Офлайн
Нужен постоянный мониторинг
Офлайн
masterito прав. Так не бывает. Все утилиты мониторинга оперируют каким-то периодом. 1мс, 10мс, 100мс, 1час, … но это должен быть конкретный промежуток. Посмотрите как работают утилиты вроде ‘top’ или диспетчера задач Windows, они обновляют свои значения раз в секунду или около того.
Отредактировано Soteric (Окт. 26, 2013 13:31:25)
Офлайн
это я понимаю, и когда делаю таймслип , код не работает как положено
в общем, если есть указанный процесс , то все нормально до того момента пока процесс не станет кушать ресурсы, если процесса нет , то ставлю таймслип, и вообще все замирает, даже если процесс вновь появился
Офлайн
Запость код с таймслипом
Офлайн
if p.Name == proc_n: print p.Name,res , f.get_cpu_percent() if f.get_cpu_percent() > numb: time.sleep(2) if f.get_cpu_percent() > numb: subprocess.Popen('taskkill /PID %d /T /f' % int(res), shell = True) else: time.sleep(5)
Офлайн
может стоит просто мониторить сам проц
psutil.cpu_percent(interval=1, percpu=True)
Офлайн
Насколько я понял, 5 секунд здесь - это задержка между проверкой двух процессов. sleep нужно вынести за пределы for.
Офлайн
Sotericи за пределы выносил…хотя еще раз попробую
Насколько я понял, 5 секунд здесь - это задержка между проверкой двух процессов. sleep нужно вынести за пределы for.
Отредактировано sanodin (Окт. 26, 2013 13:57:29)
Офлайн