如何使用“Get-wmiObject”监视Windows Java进程

时间:2011-10-21 15:05:55

标签: java powershell wmi monitoring

我有一些有时会死的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 个答案:

答案 0 :(得分:1)

您可以这样做:

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

$notrunning

答案 1 :(得分:1)

如果您可以在服务器上使用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"}

答案 2 :(得分:0)

$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)

regexp肯定需要继续工作。您可以添加一些其他警告方法(电子邮件?),甚至尝试在if语句中自动重启缺失的进程。

相关问题