如何在while循环中监视两个进程时知道哪个进程死了

时间:2017-06-21 07:57:09

标签: powershell

我正在监视服务器上的两个进程。当其中一个人去世时,我需要知道它是哪一个。

有没有比我到目前为止检查这个更好的方法?如果没有到目前为止的if / elseif,有没有办法做到这一点?

while ((ps proc1 -ov websrv).Responding -and (ps proc2 -ov connec).Responding) 
{ sleep -m 100 }

$pmsname = if (!$websrv.Responding -and !$connec.Responding) { "beide" }
            elseif (!$websrv.Responding -and $connec.Responding) { "websrv" }
            elseif ($websrv.Responding -and !$connec.Responding) { "connec" }

2 个答案:

答案 0 :(得分:6)

你可以这样做:

$status = [int]$websrv.Responding + [int]$connec.Responding * 2

$pmsname = switch ($status) {
  0 { 'keiner' }
  1 { 'websrv' }
  2 { 'connec' }
  3 { 'beide' }
  default { throw "unrecognized status: $status" }
}

如果进程正在响应,则将Responding属性的值转换为整数会给出值1,如果不响应,则返回0。通过将该数字与第二个进程的2相乘,可以使两个进程的“响应”状态相互区分,以便您可以添加这些值并使用switch语句来确定整体状态。

答案 1 :(得分:3)

Ansgar的答案应该完美无缺,但在我看来,对于制作脚本来说有点深奥。

这样的事情只会依次检查每个流程以确保它们正在运行,这样更易​​读,也可以让您更轻松地调整流程数。

$Processes = ("dwm","explorer","fakeproc")

while ($true){
    foreach ($ProcName in $Processes){
        $Proc = Get-Process $ProcName -ea SilentlyContinue
        if ($Proc -eq $null -or !$Proc.Responding){
            Write-Host "Process '$($ProcName)' Not Responding" -Fore Red
        }
    }
    Sleep 1
}