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コマンドレットをループで使用して、サービスのステータスを確認してみませんか。

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 に答える