Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Проверка занимаемой памяти запущенного процесса (http://forum.oszone.net/showthread.php?t=348642)

KaDirZhan 28-04-2021 12:44 2956558

Проверка занимаемой памяти запущенного процесса
 
Доброго времени суток!
Подскажите пожалуйста батник который проверяет каждые секунды запущен ли процесс и если например он запущен и занимает больше 150мб памяти в оперативной памяти то дальше выполняются следующие сценарии

Elven 28-04-2021 13:29 2956561

Батниками такое не реализуется (по крайней мере постоянное отслеживание), этим должна заниматься служба. Максимум - можно загнать в шедулер чтобы проверялось каждые n минут, но это такой себе вариант. Проверять можно через tasklist с соответствующими фильтрами (подробнее - здесь), полагаю это будут MEMUSAGE и IMAGENAME.

KaDirZhan 28-04-2021 13:45 2956564

Если батником не получиться то не беда)

В сети нашел вот такой скрипт поможете переделать под мои нужды?
что бы через 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 2956569

вот на 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 2956573

Цитата:

Цитата alpap
Цитировать »

Проверка не работает, скрип убивает процесс даже с 5 мб

alpap 28-04-2021 17:43 2956596

еще три нолика надо дописать чтобы Мб получились
вот на 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 2956613

Цитата:

Цитата alpap
еще три нолика надо дописать чтобы Мб получились »

Можно просто написать 150MB. ))
И почему -le?
Код:

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

alpap 29-04-2021 01:03 2956623

Цитата:

Цитата DJ Mogarych
Можно просто написать 150MB »

да как-то ..., можно конечно, потом уже подумал
Цитата:

Цитата DJ Mogarych
И почему -le »

ну под while для true должно быть не больше иначе он и не почешется
и ..., это же просто условие? Мониторинг надо делать из шедулера, например? Не запускать же скрипт самому каждые там сколько-то секунд?


Время: 23:39.

Время: 23:39.
© OSzone.net 2001-