Показать полную графическую версию : Проверка занимаемой памяти запущенного процесса
KaDirZhan
28-04-2021, 12:44
Доброго времени суток!
Подскажите пожалуйста батник который проверяет каждые секунды запущен ли процесс и если например он запущен и занимает больше 150мб памяти в оперативной памяти то дальше выполняются следующие сценарии
Батниками такое не реализуется (по крайней мере постоянное отслеживание), этим должна заниматься служба. Максимум - можно загнать в шедулер чтобы проверялось каждые 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
вот на 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 мб
еще три нолика надо дописать чтобы Мб получились
вот на 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) {"Алярм!"}
Можно просто написать 150MB »
да как-то ..., можно конечно, потом уже подумал
И почему -le »
ну под while для true должно быть не больше иначе он и не почешется
и ..., это же просто условие? Мониторинг надо делать из шедулера, например? Не запускать же скрипт самому каждые там сколько-то секунд?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.