На моем сервере работает скрипт powershell, который потребляет 99% из имеющихся у меня 32 ГБ памяти. Есть ли что-то, что я могу использовать, чтобы определить, что это за скрипт и где?
Как насчет:
get-process | sort ws
Из административной подсказки PowerShell сначала получите все процессы PowerShell:
Get-Process PowerShell
Определите тот, который вызывает проблемы, и получите идентификатор процесса. Теперь используйте WMI, чтобы получить командную строку, которая его запустила:
Get-CimInstance Win32_Process -Filter "processid = '1234'" | Select Commandline
Это должно дать вам отправную точку для дальнейшего расследования.
Откройте приглашение Powershell от имени администратора и выполните следующие две строки:
$id = (Get-Process powershell | sort WorkingSet -Descending | select -first 1).Id
Get-WmiObject Win32_Process -Filter "ProcessId = '$id'" | Select CommandLine
Это позволит получить командную строку для самого загруженного процесса powershell. Вам нужно запустить его от имени администратора, иначе командная строка будет пустой.
Обновлено: вы можете использовать эту однострочную строку, чтобы получить командные строки трех самых загруженных процессов:
Get-Process powershell | sort WorkingSet -Descending | Select -First 3 | %{Get-WmiObject Win32_Process -Filter "ProcessId = $($_.Id)" | Select CommandLine}
Хороший улов. Исправлено, чтобы он использовал WorkSet вместо CPU.
Это (вероятно) будет работать, хотя предполагается, что процесс, потребляющий больше всего процессорного времени, также потребляет больше всего памяти. Поскольку проблема заключается в использовании памяти, кажется, что запрос одного из связанных с памятью свойств класса
Win32_Process
, такого какGet-WmiObject -Class Win32_Process -Property CommandLine, ProcessId, WorkingSetSize -Filter 'Name = ''powershell.exe''' | Sort-Object -Property WorkingSetSize -Descending | ...
, был бы более прямым и надежным подходом.