2 votos

Notificación por correo electrónico cuando el servicio automático no se inicia (Windows Server 2012 R2)

Tenemos unos cuantos servidores (Windows Server 2012 R2) en nuestro entorno que instalan las actualizaciones automáticamente y se reinician después.

Tras el reinicio, queremos comprobar el estado de todos los servicios (de Windows) que están configurados para iniciarse automáticamente. Si un servicio no se inicia, el scriptintentaría iniciar el servicio 3 veces y si todos los intentos fallan, debería enviar una notificación por correo electrónico para que podamos comprobar qué pasa con este servicio en este servidor.

Me preguntaba si ya existía una solución fácil, tal vez un PowerShell script?

1voto

Jack Pettersson Puntos 148

Te aconsejaría que miraras de conseguir un NMS. Nosotros usamos PRTG y funciona bien. En él puedes crear sensores que monitorizan los servicios de Windows usando WMI. Puedes configurar el sensor para que envíe correos/ inicie scripts si el servicio se cae.

PRTG tiene licencia por sensores, pero la versión gratuita le da 100, lo que debería ser suficiente para un par de servidores (Se necesita un sensor por servicio a supervisar)

1voto

Powershell sería una buena manera de supervisar estos servicios. Curiosamente, hoy estaba leyendo un blog sobre esto. Voy a tratar de enlazar el script si puedo encontrarlo, pero la esencia general de la misma sería:

1.) Busque los servicios que están configurados para iniciarse automáticamente.

2.) Comprobar el estado del servicio.

El truco es que el

get-service

El cmdlet no muestra ningún tipo de 'StartupType', por lo que tendrá que utilizar el objeto WMI Win32_Service en su lugar.

Foreach($Server in $ServerList){
    Get-WmiObject -ComputerName $Server Win32_Service | 
    Where-Object {$_.StartMode -eq 'Auto' -AND $_.State -eq 'Stopped'}
}

De este modo, obtendrá una lista de servicios que se ajustan a los parámetros deseados.

NOTAS Hay un par de notas al respecto:

1.) Le recomiendo que tenga este script que se inicie un par de minutos después de que los servidores se inicien ya que el $_.StartMode -eq 'Auto' abarcará los servicios configurados para iniciarse inmediatamente después de arrancar y los configurados para iniciarse automáticamente después de un retraso.

2.) Habrá servicios que serán devueltos a través de este one-liner que probablemente no le interese monitorizar. (Por ejemplo, en mi portátil, un servicio llamado "TrustedInstaller" encaja en este criterio y fue devuelto como un servicio detenido :/ ) Así que lo más probable es que tenga que filtrar estos también.

1voto

Jon Conley Puntos 289

Servicio > Propiedades > Recuperación

enter image description here

Puede seleccionar qué hacer en los 3 primeros fallos, incluyendo el reinicio del servicio o la ejecución de un comando.

Aquí es donde también se utilizaría Ejecutar el programa para poner tu script que reinicie el servicio, borre un archivo, te envíe una notificación, etc. Estoy a favor de NMS (Zabbix) o Powershell script, pero la mayor parte de esto se puede resolver de forma nativa y GPO (si es aplicable a su entorno) puede tener este conjunto a través de todos los servicios / máquinas necesarias.

0voto

Daniel O'Connor Puntos 665

He encontrado un Powershell script que me viene perfecto, sólo tengo que personalizarlo un poco. Aquí está el enlace http://doitcloudy.blogspot.de/2014/07/scriptgesteuerter-neustart-von-Windows.html (alemán, pero el script de la parte inferior de la página es todo inglés). Sin embargo, necesito ayuda con esta parte (líneas 130 y siguientes):

foreach ($item in $report){
Write-Host "Starting Service " $item.Name " on server: " $item.Server -Foregroundcolor yellow
$start = Get-Date
$startSVCblock = {param($item) Start-Service -InputObject (Get-Service -ComputerName $item.Server -Name $item.Name)}
$j = Start-Job -ScriptBlock $startSVCblock -Arg $item
do {
    if ($j.State -ne 'Running') { break} 
    $j | Receive-Job
} while (((Get-Date) - $start) -le $timeout)

}

Veo que esta es la parte donde el script inicia un servicio, pero no estoy acostumbrado a los trabajos en Powershell. Cómo debería editar el script para que cuando el arranque del servicio falle, escriba el nombre del servicio en un archivo de registro? Tal vez con try/catch?

Editar:

Si alguien se tropieza con esto y quiere saber cómo lo resolví: Después de mucho investigar descubrí que es extremadamente difícil escribir la salida de Receive-Job en un archivo de registro. Así que elegí un enfoque diferente: Compruebo si el servidor está funcionando después de que el trabajo haya terminado. Aquí está el código:

foreach ($item in $report){
Write-Output "Starting Service " $item.Name " on server: " $item.Server
$start = Get-Date
$startSVCblock = {param($item) Start-Service -InputObject (Get-Service -ComputerName $item.Server -Name $item.Name)}
$j = Start-Job -ScriptBlock $startSVCblock -Arg $item
do {
    if ($j.State -ne 'Running') { break} 
    $j | Receive-Job
} while (((Get-Date) - $start) -le $timeout)
$newService = Get-Service -ComputerName $item.Server -Name $item.Name
if ($newService.Status -ne "Running") { LogWrite "$item could not start" }

}

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: