Завершить процесс с помощью сценария оболочки / пакета на основе значения памяти частного рабочего набора - PullRequest
0 голосов
/ 15 апреля 2019

Хотелось бы узнать, как настроить следующий код, чтобы убить определенный процесс (существует несколько процессов с одинаковыми именами) на основе использования памяти в его частном рабочем наборе.

Get-Process myPROCESSNAME -ea 0 | where { $_.PM -le 10MB } | foreach {
    $Path = $_.Path
    if ($Path) {
        Stop-Process $_ -Force
    }
}

Когда я открываю диспетчер задач, я ясно вижу, что процессы, которые я хочу автоматически уничтожить, используют около 4 МБ ОЗУ, а те, которые я не хочу уничтожать, используют более 20 МБ ОЗУ.

Я возился с консольным приложением C #, но я не смог получить то же самое чтение памяти, которое я вижу через диспетчер задач.Затем я понял, что диспетчер задач отображает память частного рабочего набора (по умолчанию), так что это то, что мне нужно, чтобы отфильтровать плохие процессы.

Может ли это быть достигнуто с помощью сценария пакетной обработки / PowerShell?

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Если вы действительно хотите Memory (Private Working Set), вы можете получить эту информацию, используя с Get-WmiObject:

Get-WMIObject -Class Win32_PerfRawData_PerfProc_Process -Property IDProcess,Name,WorkingSetPrivate | `
    Where-Object { $_.Name -Eq 'myPROCESSNAME' -And $_.WorkingSetPrivate -Lt 5242880 } | `
    ForEach-Object { ( Get-Process -Id $_.IDProcess ).CloseMainWindow() }

Обратите внимание, что вам может потребоваться проверить значение Name, обычно это имя исполняемого файла без его .exe расширения . В этом примере я использовал 5MB (т. Е. 5242880 байт) в качестве минимального размера, который остается открытым. Кроме того, для целей этого примера я использовал «дружественную» инструкцию CloseMainWindow для закрытия процесса, в зависимости от вашего процесса вам может потребоваться изменить его на что-то более подходящее.

0 голосов
/ 15 апреля 2019

В пакетном режиме вы можете сделать это также.

@echo off
for /f "tokens=2" %%i in ('tasklist /FI "memusage lt 10000" ^|findstr /i "myPROCESSNAME"') do echo taskkill /PID %%i

Это создаст список задач и получит процессы с использованием памяти l ess t han 10000kb (10mb).

Затем мы просто используем findstr для подгонки вашего процесса (myPROCESSNAME) и затем убиваем процесс его PID.

Примечание Я добавил echo после выполнения. Это для целей тестирования, так что вы можете по крайней мере увидеть, что будет делать команда без фактически выполнения задачи. Как только вы довольны результатом, удалите echo, чтобы фактически выполнить команду taskkill.

Я предлагаю вам прочитать справку по приведенным выше командам:

  • for /?
  • findstr /?
  • tasklist /?
  • taskkill /?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...