Войти

Показать полную графическую версию : Проверка занимаемой памяти запущенного процесса


KaDirZhan
28-04-2021, 12:44
Доброго времени суток!
Подскажите пожалуйста батник который проверяет каждые секунды запущен ли процесс и если например он запущен и занимает больше 150мб памяти в оперативной памяти то дальше выполняются следующие сценарии

Elven
28-04-2021, 13:29
Батниками такое не реализуется (по крайней мере постоянное отслеживание), этим должна заниматься служба. Максимум - можно загнать в шедулер чтобы проверялось каждые n минут, но это такой себе вариант. Проверять можно через tasklist с соответствующими фильтрами (подробнее - здесь (https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/tasklist)), полагаю это будут MEMUSAGE и IMAGENAME.

KaDirZhan
28-04-2021, 13:45
Если батником не получиться то не беда)

В сети нашел вот такой скрипт поможете переделать под мои нужды?
что бы через tasklist проверял каждые секунды запуск нужного процесса, если найден процесс и занимает 150 мб то, чтоб он не убивал процесс а замораживал, после истечений 5 минут размораживал

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")

Set colProcesses = objWMIService.ExecQuery( _
"Select * From Win32_Process " _
& "Where Name = 'notepad.exe'")

Killed = False
For Each objProcess In colProcesses
If objProcess.WorkingSetSize > 6291456 Then
objProcess.Terminate
Killed = True
End If
Next

If Killed Then
Set objShell = Wscript.CreateObject("Wscript.Shell")
objShell.Run "notepad.exe"
End If

alpap
28-04-2021, 14:00
вот на bat с проверкой каждую секунду (в данном коде при превышении происходит перезапуск этого процесса) и это конечно нагружает процессор и это конечно извращение при наличии сейчас правильных инструментов

@echo off
set "pr=programma.exe"
set "mb=150000"

cmd /c for /l %%# in () do tasklist /fi "imagename eq %pr%" /fi "memusage gt %mb%"^&^& (^>nul 2^>^&1 taskkill /f /im "%pr%"^& start "" "%pr%"^& exit /b)^& ^>nul timeout /t 1 /nobreak
pause

KaDirZhan
28-04-2021, 14:36
Цитировать »
Проверка не работает, скрип убивает процесс даже с 5 мб

alpap
28-04-2021, 17:43
еще три нолика надо дописать чтобы Мб получились
вот на PowerShell, но легче не станет, все равно висящий нагружающий процесс
(как только процесс превысит указанное потребление будет создан файл 'file.txt' в текущей директории, мониторинг - 3сек)

While ((Get-Process).where{$_.Name -eq 'Имя процесса' -and $_.WS -le 150000000}) {Start-Sleep -Second 3}
New-Item 'file.txt'

DJ Mogarych
28-04-2021, 22:36
еще три нолика надо дописать чтобы Мб получились »
Можно просто написать 150MB. ))
И почему -le?

if ((Get-Process processname -OutVariable proc) -and $proc.ws -ge 150MB) {"Алярм!"}

alpap
29-04-2021, 01:03
Можно просто написать 150MB »
да как-то ..., можно конечно, потом уже подумал
И почему -le »
ну под while для true должно быть не больше иначе он и не почешется
и ..., это же просто условие? Мониторинг надо делать из шедулера, например? Не запускать же скрипт самому каждые там сколько-то секунд?




© OSzone.net 2001-2012