1

我有一个脚本可以进行一些服务器维护。部分工作是停止和重新启动主机服务器上的服务。判断服务何时再次完全在线的最简单方法是尝试连接到管理端口。一旦您能够连接到管理端口,服务就已启动并准备好开展业务。很简单。这段代码将循环直到它重新上线:

function test-port {
$PortProbe = New-Object Net.Sockets.TcpClient
$ErrorActionPreference = "SilentlyContinue"

while ($PortProbe.Connected -eq 0){
$PortProbe.Connect("localhost",3041) 
write-host "Server is off line... waiting for it to come online."
sleep 1

}
write-host "Server is back online!"
$ErrorActionPreference = "Continue"
 $PortProbe.Close()
}

test-port

因此,在我的脚本中,我完成了我的工作,重新启动服务,然后调用“test-port”让脚本等待服务重新联机,然后再继续。

我遇到的问题是,如果我在脚本中有一个通用陷阱,它会在端口尚未准备好时捕获连接错误。

Exception calling "Connect" with "2" argument(s): "No connection could be made because the target machine actively refused it 127.0.0.1:3041"
At line:6 char:27
+         $PortProbe.Connect <<<< ("localhost",3041) 
+ CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException

最后我有一个陷阱声明,以防发生一些非常奇怪的错误,它会启动电子邮件警报。但它破坏了测试端口功能的功能。

理论上,我可以捕获这个特定的 TCP/IP 连接错误并告诉它继续继续,就像什么都没发生一样,但我不知道如何判断错误消息的类别是什么。我认为它会是这样的:

trap [Net.Sockets.TcpClient] { #Don't Panic
}

但这是不对的。

有什么建议么?我需要完全不同地处理这个吗?

4

1 回答 1

0

Get-Service为什么不在循环中使用 cmdlet 来检查服务的状态,而不是放入套接字,例如:

do { 
    $svc = Get-Service -ComputerName Localhost w3svc
    $connected = $false
    if ($svc -and $svc.Status -eq 'Running')     { 
        $connected = $true 
    }
    Start-Sleep -Milliseconds 500 
} while (!$connected)
于 2013-01-04T23:48:08.547 回答