Как контролировать процессы Windows Java с помощью «Get-wmiObject» - PullRequest
3 голосов
/ 21 октября 2011

У меня есть некоторые java-компоненты, которые иногда умирают, и единственный способ, который я знаю, - когда пользователь сравнивает данные, они получают ошибку.

Что я сделал в наших системах мониторинга, так это подсчитал количество java-процессов, запущенных на сервере.Если компонент умирает, меня предупреждают, что пороговое значение Java ниже нормального, и я вхожу в систему, чтобы узнать, какой из компонентов Java умер.Это работает, но я думаю, что можно уточнить, какой компонент умер, и иметь возможность запускать процесс Java удаленно.

Итак, я подумал о написании скрипта Powershell, который выполняется из системы мониторинга.Я думаю, что у меня есть большая часть «одного лайнера», но мне нужно немного больше помощи, чтобы привести меня к финишу, так как я думаю, что этот сценарий не нуждается в разработке.

$theProcess = Get-WmiObject win32_process -Filter "name like '%java%'" | select commandLine

Вывод этой команды дает мне все параметры, отправленные JVM, включая имя компонента, позволяет вызвать компонент «COMP_Number1», и обычно выполняется 5 процессов компонента Java, поэтомуимена компонентов: «COMP_Number2», «COMP_Number3» и т. д.

Мой вопрос: учитывая вывод $ theProcess, как я могу проверить все процессы Java, чтобы проверить, что все компоненты работают?А если нет, то какой из них не запущен?

Многое оценено!

TT

Ответы [ 3 ]

1 голос
/ 22 октября 2011

Если вы можете использовать WMI на сервере, вы можете использовать события WMI для обнаружения остановленных процессов.

Register-WMIEvent -Query "SELECT * FROM Win32_ProcessStopTrace WHERE ProcessName like 'notepad%'" -Action {Write-Host "kind of notepad process is died"; Write-Host $args}

Здесь вы обнаружите notepad.exe кубик, а также notepad++.exe.

Вы можете использовать Get-EventSubscriber для получения событий, на которые вы ссылаетесь, и Unregister-Event для отмены.

Блок сценария рассматривается как задание, поэтому будьте осторожны при импорте всех необходимых вам модулей.

Блок скрипта получает два параметра:

1) System.Management.ManagementEventWatcher

2) System.Management.EventArrivedEventArgs

Вот параметры $args[1].newevent:

ExitStatus          Property   System.UInt32 ExitStatus {get;set;}
ParentProcessID     Property   System.UInt32 ParentProcessID {get;set;}
ProcessID           Property   System.UInt32 ProcessID {get;set;}
ProcessName         Property   System.String ProcessName {get;set;}
SECURITY_DESCRIPTOR Property   System.Byte[] SECURITY_DESCRIPTOR {get;set;}
SessionID           Property   System.UInt32 SessionID {get;set;}
Sid                 Property   System.Byte[] Sid {get;set;}

Пример:

Register-WMIEvent -Query "SELECT * FROM Win32_ProcessStopTrace WHERE ProcessName like 'notepad%'" -Action {Write-Host "$($args[1].newevent.ProcessName) process is died"}
1 голос
/ 21 октября 2011

Вы можете сделать что-то вроде этого:

$components = @("COMP_Number1","COMP_Number2")
$theProcess | %{ 
    $p = $_
    $running = $components | ?{$p.commandline -match $_}
    $notrunning = $components | ?{ $running -notcontains $_ }
}

$notrunning
0 голосов
/ 21 октября 2011
$components = @("COMP_Number1","COMP_Number2")
$running = @()
do {
   Get-WmiObject win32_process -Filter "name like '%java%'" | select commandLine | Foreach-Object {
      $running += ($_.commandLine -replace ".*(COMP_Number\d).*",'$1')
   }
   if ($running.Count -lt $components.Count) {
     Compare-Object ($running | Sort-Object) ($components | Sort-Object)
   }
   $running = @()
   Start-Sleep 50000
} until (1 -lt 0)

Регулярное выражение наверняка нуждается в работе.Вы можете добавить какой-нибудь другой метод предупреждения (электронная почта?) Или даже попытаться автоматически перезапустить отсутствующий процесс в операторе if.

...