Domanda

Desidero automatizzare il processo di riavvio del server Windows 2000+ utilizzando l'Utilità di pianificazione o uno strumento simile per riavviare in remoto un server e attendere che venga ripristinato.Posso emettere shutdown O psshutdown per riavviare da remoto, ma voglio qualcosa di meglio di sleep ad aspettare che ritorni.Devo verificare che sia di nuovo online entro n minuti o generare un errore.

Tornando online, vorrei verificare non solo che sia possibile effettuare il ping, ma forse il suo servizio RFC sta rispondendo o qualche altro segno vitale determinato.

Preferirei un approccio con script NT, ma non escludo di scrivere uno strumento personalizzato per farlo.

Qualche idea?

È stato utile?

Soluzione

Lo script di riavvio remoto potrebbe avviare il server, attendere n minuti, quindi interrogare il servizio RFC.Potresti anche fare in modo che uno script locale sul server faccia la stessa cosa.

Altri suggerimenti

Dopo aver lavorato su questo per un po', ho creato il seguente VBScript.Sentiti libero di commentare/migliorare.

'
' 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

Potresti usare psservice per interrogare lo stato dei servizi RFC o spooler di stampa.Lo Spooler è solitamente uno degli ultimi servizi ad avviarsi.Potresti usare una sintassi come:

psservice \\someothermachine query spooler

Ciò restituirà qualcosa di simile una volta che il servizio sarà in esecuzione.

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                                                                   

Se l'altra macchina non è pronta, otterrai qualcosa di simile

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

Con VBScript (WSH) puoi verificarlo con la proprietà .state.Questo script mostra la proprietà utilizzata in un'applicazione diversa ma dovrebbe aiutare a illustrare l'idea:

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

Utilizzo nmap per ottenere un elenco di servizi aperti sulla macchina e analizzare i risultati per assicurarsi che ciò di cui hai bisogno sia attivo.È anche utile assicurarsi che le cose ti coinvolgano non i bisogni sono non attivo.

Puoi eseguire il polling di alcuni servizi principali per vedere se è stato avviato:

sc "\\server_name" query EventSystem

La chiave qui è che devo scriverlo.Esiste un modo più semplice per estrarre lo stato del servizio da psservice/sc query?Sono in grado di trasmetterlo findstr "RUNNING", ma deve esserci un modo migliore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top