5

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

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

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

何か案は?

4

7 に答える 7

8

これにしばらく取り組んだ後、次の 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
于 2008-09-29T12:11:41.023 に答える
2

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

psservice \\someothermachine query spooler

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

SERVICE_NAME:スプーラー                                                                             
DISPLAY_NAME:印刷スプーラー                                                                       
すべてのローカルおよびネットワークの印刷キューを管理し、すべての印刷ジョブを制御します。このサービスが停止している場合
ped、ローカルマシンでの印刷は利用できなくなります。このサービスが無効になっている場合、すべてのサービス
明示的に依存しているものは起動に失敗します。                                                  
        グループ:SpoolerGroup                                                          
        タイプ:110 WIN32_OWN_PROCESS INTERACTIVE_PROCESS                             
        状態:4ランニング                                                            
                               (STOPPABLE、NOT_PAUSABLE、ACCEPTS_SHUTDOWN)                          
        WIN32_EXIT_CODE:0(0x0)                                                              
        SERVICE_EXIT_CODE:0(0x0)                                                              
        チェックポイント:0x0                                                                   
        WAIT_HINT:0x0                                                                   

他のマシンの準備ができていない場合は、次のようなものが得られます

\\ someothermachineに接続できません:                                                                  
RPCサーバーは利用できません。
于 2008-09-11T14:21:57.917 に答える
2

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

于 2008-09-11T14:18:16.613 に答える
1

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

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

于 2008-09-11T15:37:08.827 に答える
0

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

sc "\\server_name" query EventSystem
于 2008-09-11T14:23:50.877 に答える
0

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

于 2008-09-11T14:24:57.037 に答える
0

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

于 2008-09-11T14:41:11.583 に答える