Pergunta

Eu quero automatizar um Windows 2000+ reinicialização do servidor de processo usando o Agendador de Tarefas ou uma ferramenta similar para reiniciar remotamente um servidor e esperar por ele para voltar para cima.Eu posso problema shutdown ou psshutdown para reiniciar remotamente, mas eu quero algo melhor do que sleep esperar por ele para voltar.Eu preciso verificar se ele está on-line no prazo de n minutos ou lançar um erro.

Por 'online', eu gostaria de verificar mais do que apenas o que pode ser alcançado, mas, talvez, a sua RFC serviço é de responder ou algum outro determinado sinal vital.

Eu prefiro um NT script de abordagem, mas eu não estou a decisão de escrever uma ferramenta personalizada para fazer isso.

Qualquer idéias?

Foi útil?

Solução

Seu controle remoto de reiniciar o script pode iniciar o servidor, aguarde n minutos, em seguida, consultar o RFC serviço.Você também poderia ter um local de script no servidor fazer a mesma coisa.

Outras dicas

Depois de trabalhar sobre isso por um tempo, eu vim com o seguinte VBScript.Sinta-se livre para comentar/melhorar.

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

Você poderia usar psservice para consultar o status da RFC ou de Spooler de Impressão serviços.O Spooler é, geralmente, um dos últimos serviços para iniciar.Você pode usar a sintaxe:

psservice \\someothermachine query spooler

Que irá retornar algo como este uma vez que o serviço está em execução.

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 o outro computador não está pronto, você terá algo como

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

Com o VBScript (WSH), você pode verificá-lo com o .a propriedade do estado.Este script mostra que a propriedade que está sendo usada em um aplicativo diferente, mas deve ajudar a ilustrar a idéia:

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

Utilização o nmap para obter uma lista de serviços abertos na máquina e analisar os resultados para certificar-se de que você precisa está ativo.Também é útil para se certificar de que as coisas que você não precisa são não active.

Você pode pesquisar alguns núcleo de serviço para ver se ele já foi iniciado:

sc "\\server_name" query EventSystem

A chave aqui é que eu preciso para este script.Existe uma forma de limpeza para extrair o status do serviço de psservice/sc query?Eu sou capaz de canalizá-lo para findstr "RUNNING", mas tem que haver uma maneira melhor.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top