再起動後に Windows サーバーが利用可能かどうかを検出するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/56644

  •  09-06-2019
  •  | 
  •  

質問

タスク スケジューラまたは同様のツールを使用して Windows 2000 以降のサーバーの再起動プロセスを自動化し、サーバーをリモートで再起動し、再起動を待ちたいと考えています。発行できます shutdown または psshutdown リモートで再起動できますが、それよりも優れたものが必要です sleep それが戻ってくるのを待つこと。以内にオンラインに戻っていることを確認する必要があります n 数分かかるか、エラーがスローされます。

「オンラインに戻る」とは、単に ping できるかどうかだけでなく、おそらく RFC サービスが応答しているか、その他の決定的なバイタル サインであることを確認したいと考えています。

私は NT スクリプトのアプローチを好みますが、これを行うためのカスタム ツールを作成することも除外しません。

何か案は?

役に立ちましたか?

解決

リモート再起動スクリプトはサーバーを起動し、n 分間待機してから、RFC サービスにクエリを実行できます。サーバー上のローカル スクリプトで同じことを行うこともできます。

他のヒント

しばらくこれに取り組んだ後、次の VBScript を思いつきました。気軽にコメント/改善してください。

'
' Remotely reboot a server and
' wait for server to come back up.
'
' Usage:  cscript /nologo /E:VBScript RebootWait.vbs <Server Name>
'
' Shawn Poulson, 2008.09.11
'

'
' Get server name from command line
'
If WScript.Arguments.Count <> 1 Then
   ShowUsage()
   WScript.Quit(1)
End If

ServerName = WScript.Arguments(0)

'
' Verify server is currently up
'
WScript.StdOut.WriteLine Now & ": Verify server '" & ServerName & "' is currently up..."
If Not IsAvailable(ServerName) Then
   WScript.StdOut.WriteLine "Error: Server is down.  Reboot aborted!"
   WScript.Quit(1)
End If
WScript.StdOut.WriteLine Now & ": Server is up."

'
' Reboot server
'
WScript.StdOut.WriteLine Now & ": Rebooting server '" & ServerName & "'..."
RebootStatus = RebootServer(ServerName)
If RebootStatus < 0 Then
   WScript.StdOut.WriteLine "Error: Reboot returned error " & RebootStatus
   WScript.Quit(1)
End If
WScript.StdOut.WriteLine Now & ": Reboot command was successful"

'
' Wait for server to come down
'
WScript.StdOut.Write Now & ": Waiting for server '" & ServerName & "' to go down..."
WaitCount = 0
Do While IsAvailable(ServerName)
   WaitCount = WaitCount + 1
   If WaitCount > 60 Then ' 5 min timeout
      WScript.StdOut.WriteLine "Error: Timeout waiting for server to come down!"
      WScript.Quit(1)
   End If
   WScript.StdOut.Write(".")
   WScript.Sleep(5000)
Loop
WScript.StdOut.WriteLine "Success!"
WScript.StdOut.WriteLine Now & ": Server is down."

'
' Wait for server to come back up
'
WScript.StdOut.Write Now & ": Waiting for server '" & ServerName & "' to come back up..."
WaitCount = 0
Do While Not IsAvailable(ServerName)
   WaitCount = WaitCount + 1
   If WaitCount > 240 Then ' 20 min timeout
      WScript.StdOut.WriteLine "Error: Timeout waiting for server to come back up!"
      WScript.Quit(1)
   End If
   WScript.StdOut.Write(".")
   WScript.Sleep(5000)
Loop
WScript.StdOut.WriteLine "Success!"
WScript.StdOut.WriteLine Now & ": Server is back up after reboot."

'
' Success!
'
WScript.Quit(0)


Sub ShowUsage()
   WScript.Echo "Usage: " & WScript.ScriptName & " <Server name>"
End Sub

' Returns:
' 1 = Successfully issued reboot command
' -2 = Could not reach server
' -3 = Reboot command failed
Function RebootServer(ServerName)
   Dim OpSystem
   On Error Resume Next
   For Each OpSystem in GetObject("winmgmts:{(Shutdown)}!\\" & ServerName & "\root\CIMV2").ExecQuery("select * from Win32_OperatingSystem where Primary=true")
      On Error GoTo 0

      If IsObject(OpSystem) Then
         ' Invoke forced reboot
         If OpSystem.Win32Shutdown(6, 0) = 0 Then
            ' Success
            RebootServer = 1
         Else
            ' Command failed
            RebootServer = -3
         End If

      Else
         RebootServer = -2

      End If
   Next
End Function

' Return True if available
Function IsAvailable(ServerName)
   ' Use Windows RPC service state as vital sign
   IsAvailable = (GetServiceState(ServerName, "RpcSs") = "Running")
End Function

' Return one of:
'  Stopped, Start Pending, Stop Pending,
'  Running, Continue Pending, Pause Pending,
'  Paused, Unknown
Function GetServiceState(ServerName, ServiceName)
   Dim Service
   On Error Resume Next
   Set Service = GetObject("winmgmts:\\" & ServerName & "\root\CIMV2:Win32_Service='" & ServiceName & "'")
   On Error GoTo 0
   If IsObject(Service) Then GetServiceState = Service.State
End Function

使用できます psサービス RFC または Print Spooler サービスのステータスを照会します。スプーラーは通常、最後に開始されるサービスの 1 つです。次のような構文を使用できます。

psservice \\someothermachine query spooler

サービスが実行されると、次のようなものが返されます。

SERVICE_NAME: Spooler                                                                             
DISPLAY_NAME: Print Spooler                                                                       
Manages all local and network print queues and controls all printing jobs. If this service is stop
ped, printing on the local machine will be unavailable. If this service is disabled, any services 
that explicitly depend on it will fail to start.                                                  
        GROUP             : SpoolerGroup                                                          
        TYPE              : 110 WIN32_OWN_PROCESS INTERACTIVE_PROCESS                             
        STATE             : 4  RUNNING                                                            
                               (STOPPABLE,NOT_PAUSABLE,ACCEPTS_SHUTDOWN)                          
        WIN32_EXIT_CODE   : 0  (0x0)                                                              
        SERVICE_EXIT_CODE : 0  (0x0)                                                              
        CHECKPOINT        : 0x0                                                                   
        WAIT_HINT         : 0x0                                                                   

他のマシンの準備ができていない場合は、次のようなメッセージが表示されます。

Unable to connect to \\someothermachine:                                                                  
The RPC server is unavailable. 

VBScript (WSH) では、.state プロパティで確認できます。このスクリプトは、そのプロパティが別のアプリケーションで使用されていることを示していますが、アイデアを説明するのに役立ちます。

http://www.robvanderwoude.com/vbstech_proc_service.html

使用 nmap マシン上で開いているサービスのリストを取得し、結果を解析して、必要なサービスがアクティブであることを確認します。必要なものが次のものであることを確認するのにも役立ちます。 しないでください 必要なのは ない アクティブ。

コア サービスをポーリングして、それが開始されているかどうかを確認できます。

sc "\\server_name" query EventSystem

ここで重要なのは、これをスクリプト化する必要があるということです。サービスステータスを抽出するよりクリーンな方法はありますか psservice/sc query?私はそれをパイプすることができます findstr "RUNNING", 、しかし、もっと良い方法があるはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top