重启后如何检测Windows服务器是否可用?

时间:2008-09-11 14:15:00

标签: windows sysadmin reboot

我想使用Task Scheduler或类似工具自动执行Windows 2000+服务器重启过程,以远程重启服务器并等待它重新启动。我可以发出shutdownpsshutdown来远程重启,但我想要比sleep更好的东西等待它回来。我需要在n分钟内验证它是否重新上线,否则会抛出错误。

通过'返回在线',我想验证的不仅仅是它可以被ping,但也许它的RFC服务正在响应或其他一些确定的生命体征。

我更喜欢NT脚本方法,但我并不排除编写自定义工具来执行此操作。

有什么想法吗?

7 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

您的远程重启脚本可以启动服务器,等待n分钟,然后查询您的RFC服务。您也可以在服务器上使用本地脚本执行相同的操作。

答案 2 :(得分:2)

您可以使用psservice来查询RFC或Print Spooler服务的状态。后台打印程序通常是最后启动的服务之一。您可以使用如下语法:

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. 

答案 3 :(得分:1)

使用VBScript(WSH),您可以使用.state属性进行检查。此脚本显示该属性在不同的应用程序中使用,但应该有助于说明这个想法:

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

答案 4 :(得分:0)

您可以轮询某些核心服务以查看它是否已启动:

sc "\\server_name" query EventSystem

答案 5 :(得分:0)

使用nmap获取计算机上的打开服务列表并解析结果以确保您需要的是活动的。确保您所需的内容有效也很有用。

答案 6 :(得分:0)

这里的关键是我需要编写脚本。是否有更简洁的方法从psservice / sc query中提取服务状态?我能够将它传递给findstr "RUNNING",但必须有更好的方法。