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

我想使用任务计划程序或类似工具来远程重启服务器并等待它重新启动,从而使Windows 2000+服务器重启过程自动化。 我可以发出shutdownpsshutdown远程重启,但我想要比sleep更好的东西等待它回来。 我需要确认它在n分钟内恢复在线或发生错误。

通过“返回在线”,我想validation更多的不仅仅是它可以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 

您可以使用psservice来查询RFC或后台打印程序服务的状态。 后台打印程序通常是最后一个启动的服务之一。 你可以使用像这样的语法:

 psservice \\someothermachine query spooler 

一旦服务运行,这将返回这样的事情。

 SERVICE_NAME:后台打印程序                                                                             
 DISPLAY_NAME:打印后台处理程序                                                                       
管理所有本地和网络打印队列并控制所有打印作业。 如果这个服务停止
在本地机器上打印将不可用。 如果这个服务被禁用,任何服务 
明确依赖于它将无法启动。                                                  
         GROUP:SpoolerGroup                                                          
         TYPE:110 WIN32_OWN_PROCESS INTERACTIVE_PROCESS                             
        状态:4运行                                                            
                                (可停止,NOT_PAUSABLE,ACCEPTS_SHUTDOWN)                          
         WIN32_EXIT_CODE:0(0x0)                                                              
         SERVICE_EXIT_CODE:0(0x0)                                                              
         CHECKPOINT:0x0                                                                   
         WAIT_HINT:0x0 

如果其他机器没有准备好,你会得到类似的东西

 无法连接到\\ someothermachine:                                                                  
 RPC服务器不可用。 

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

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

使用nmap获取计算机上打开的服务列表,并解析结果以确保您需要的是活动的。 确保你不需要的东西活跃也是有用的。

您可以轮询一些核心服务,看看它是否已经开始:

 sc "\\server_name" query EventSystem 

这里的关键是我需要编写脚本。 有没有一种更清晰的方式从psservice / sc query提取服务状态? 我能够findstr "RUNNING" ,但有一个更好的方法。