我有一个脚本可以进行一些服务器维护。部分工作是停止和重新启动主机服务器上的服务。判断服务何时再次完全在线的最简单方法是尝试连接到管理端口。一旦您能够连接到管理端口,服务就已启动并准备好开展业务。很简单。这段代码将循环直到它重新上线:
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
}
但这是不对的。
有什么建议么?我需要完全不同地处理这个吗?