Powershell 设置Get进程的时间限制

Powershell 设置Get进程的时间限制,powershell,Powershell,长话短说,我们的一些服务器出现问题,对它们造成严重影响,我正在寻找一种方法来监控它们,现在我有了一个脚本,它将检查RDP端口,以确保它是打开的,我想我要使用get service,然后如果它是否拉取了任何数据,我将返回 我不知道如何限制它在返回false之前等待响应的时间 [bool](获取进程-ComputerName MYSERVER)这是一个已知问题: 这里提供了一种解决方法: 您可以这样调用函数: function Timeout-Statement { param(

长话短说,我们的一些服务器出现问题,对它们造成严重影响,我正在寻找一种方法来监控它们,现在我有了一个脚本,它将检查RDP端口,以确保它是打开的,我想我要使用
get service
,然后如果它是否拉取了任何数据,我将返回

我不知道如何限制它在返回false之前等待响应的时间

[bool](获取进程-ComputerName MYSERVER)

这是一个已知问题:

这里提供了一种解决方法:

您可以这样调用函数:

function Timeout-Statement {
    param(
        [scriptblock[]]$ScriptBlock,
        [object[]]$ArgumentList,
        [int]$Timeout
    )

    $Runspace = [runspacefactory]::CreateRunspace()
    $Runspace.Open()

    $PS = [powershell]::Create()
    $PS.Runspace = $Runspace
    $PS = $PS.AddScript($ScriptBlock)
    foreach($Arg in $ArgumentList){
        $PS = $PS.AddArgument($Arg)
    }

    $IAR = $PS.BeginInvoke()

    if($IAR.AsyncWaitHandle.WaitOne($Timeout)){
        $PS.EndInvoke($IAR)
    }

    return $false
}
获取wmicustom-类Win32\u进程-命名空间“root\cimv2”-computername MYSERVER–超时1

这是一个已知问题:

这里提供了一种解决方法:

您可以这样调用函数:

function Timeout-Statement {
    param(
        [scriptblock[]]$ScriptBlock,
        [object[]]$ArgumentList,
        [int]$Timeout
    )

    $Runspace = [runspacefactory]::CreateRunspace()
    $Runspace.Open()

    $PS = [powershell]::Create()
    $PS.Runspace = $Runspace
    $PS = $PS.AddScript($ScriptBlock)
    foreach($Arg in $ArgumentList){
        $PS = $PS.AddArgument($Arg)
    }

    $IAR = $PS.BeginInvoke()

    if($IAR.AsyncWaitHandle.WaitOne($Timeout)){
        $PS.EndInvoke($IAR)
    }

    return $false
}

获取wmicustom-类Win32\u进程-命名空间“root\cimv2”-computername MYSERVER-超时1

您可以将检查作为后台作业运行:

$sb = { Get-Process -ComputerName $args[0] }

$end = (Get-Date).AddSeconds(5)
$job = Start-Job -ScriptBlock $sb -ArgumentList 'MYSERVER'
do {
  Start-Sleep 100
  $finished = (Get-Job -Id $job.Id).State -eq 'Completed'
} until ($finished -or (Get-Date) -gt $end)

if (-not $finished) {
  Stop-Job -Id $job.Id
}

Receive-Job $job.Id
Remove-Job $job.Id

您可以将支票作为后台作业运行:

$sb = { Get-Process -ComputerName $args[0] }

$end = (Get-Date).AddSeconds(5)
$job = Start-Job -ScriptBlock $sb -ArgumentList 'MYSERVER'
do {
  Start-Sleep 100
  $finished = (Get-Job -Id $job.Id).State -eq 'Completed'
} until ($finished -or (Get-Date) -gt $end)

if (-not $finished) {
  Stop-Job -Id $job.Id
}

Receive-Job $job.Id
Remove-Job $job.Id
虽然我喜欢有时间限制的作业,但我认为单独的运行空间和异步调用更适合此任务

这里的主要区别在于,运行空间重用进程内线程池,而PSJob方法启动一个新的进程,这会带来开销,例如操作系统/内核资源生成和管理子进程、序列化和反序列化数据等

大概是这样的:

function Timeout-Statement {
    param(
        [scriptblock[]]$ScriptBlock,
        [object[]]$ArgumentList,
        [int]$Timeout
    )

    $Runspace = [runspacefactory]::CreateRunspace()
    $Runspace.Open()

    $PS = [powershell]::Create()
    $PS.Runspace = $Runspace
    $PS = $PS.AddScript($ScriptBlock)
    foreach($Arg in $ArgumentList){
        $PS = $PS.AddArgument($Arg)
    }

    $IAR = $PS.BeginInvoke()

    if($IAR.AsyncWaitHandle.WaitOne($Timeout)){
        $PS.EndInvoke($IAR)
    }

    return $false
}
然后用它来做:

$ScriptBlock = {
    param($ComputerName)

    Get-Process @PSBoundParameters
}

$Timeout = 2500 # 2 and a half seconds (2500 milliseconds)

Timeout-Statement $ScriptBlock -ArgumentList "mycomputer.fqdn" -Timeout $Timeout
虽然我喜欢有时间限制的作业,但我认为单独的运行空间和异步调用更适合此任务

这里的主要区别在于,运行空间重用进程内线程池,而PSJob方法启动一个新的进程,这会带来开销,例如操作系统/内核资源生成和管理子进程、序列化和反序列化数据等

大概是这样的:

function Timeout-Statement {
    param(
        [scriptblock[]]$ScriptBlock,
        [object[]]$ArgumentList,
        [int]$Timeout
    )

    $Runspace = [runspacefactory]::CreateRunspace()
    $Runspace.Open()

    $PS = [powershell]::Create()
    $PS.Runspace = $Runspace
    $PS = $PS.AddScript($ScriptBlock)
    foreach($Arg in $ArgumentList){
        $PS = $PS.AddArgument($Arg)
    }

    $IAR = $PS.BeginInvoke()

    if($IAR.AsyncWaitHandle.WaitOne($Timeout)){
        $PS.EndInvoke($IAR)
    }

    return $false
}
然后用它来做:

$ScriptBlock = {
    param($ComputerName)

    Get-Process @PSBoundParameters
}

$Timeout = 2500 # 2 and a half seconds (2500 milliseconds)

Timeout-Statement $ScriptBlock -ArgumentList "mycomputer.fqdn" -Timeout $Timeout

如果问题是您有一个很长的服务器列表,并且每次失败都会占用该列表,那么请尝试使用Invoke命令或工作流并行运行请求。如果问题是您希望在几个服务器上重复运行同一请求,那么可能有更好的方法来监视该问题。如果问题是您有一个很长的服务器列表,并且每次失败都会占用该列表,那么请尝试使用Invoke命令或工作流并行运行该请求。如果问题是您希望在几个服务器上重复运行相同的请求,那么,也许有更好的方法来监控这个问题。我认为这将最适合我的脚本的其余部分,尽管我同意,我也喜欢你的想法@Ansgar Wiechers,我需要为另一个脚本提供类似的内容,因此非常感谢。我认为这将最适合我的脚本的其余部分,尽管我同意,我也喜欢你的想法@Ansgar Wiechers我需要这样的东西来制作另一个剧本,所以我很感激。