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