자동 서비스가 시작되지 않은 경우 이메일 알림(Windows Server 2012 R2)

자동 서비스가 시작되지 않은 경우 이메일 알림(Windows Server 2012 R2)

우리 환경에는 업데이트를 자동으로 설치하고 그 후에 다시 시작하는 서버(Windows Server 2012 R2)가 몇 대 있습니다.

다시 시작한 후 자동 시작으로 설정된 모든 (Windows) 서비스의 상태를 확인하고 싶습니다. 서비스가 시작되지 않은 경우 스크립트는 서비스 시작을 3번 시도하고 모든 시도가 실패하면 이 서버에서 이 서비스에 어떤 문제가 있는지 확인할 수 있도록 이메일 알림을 보내야 합니다.

PowerShell 스크립트와 같은 쉬운 솔루션이 이미 존재하는지 궁금합니다.

답변1

NMS를 받는 것을 고려해 보시는 것이 좋습니다. 우리는 PRTG를 사용하는데 잘 작동합니다. 여기에서 WMI를 사용하여 Windows 서비스를 모니터링하는 센서를 만들 수 있습니다. 서비스가 중단되면 메일/시작 스크립트를 보내도록 센서를 구성할 수 있습니다.

PRTG는 센서별로 라이선스가 부여되지만 무료 버전은 100개를 제공하므로 두 대의 서버에 충분합니다(모니터링하려면 서비스당 하나의 센서가 필요함).

답변2

Powershell은 이러한 서비스를 모니터링하는 좋은 방법입니다. 이상하게도 나는 오늘 이것에 대한 블로그를 읽고 있었습니다. 스크립트를 찾을 수 있으면 연결하려고 노력할 것입니다. 그러나 일반적인 요점은 다음과 같습니다.

1.) 자동으로 시작되도록 설정된 서비스를 찾으세요.

2.) 서비스 상태를 확인하세요.

비결은

get-service

cmdlet은 어떤 종류의 'StartupType'도 출력하지 않으므로 대신 Win32_Service WMI 개체를 사용해야 합니다.

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

그러면 원하는 매개변수에 맞는 서비스 목록이 제공됩니다.

노트 이에 대한 몇 가지 참고 사항이 있습니다.

1.) $_.StartMode -eq 'Auto'는 부팅 후 즉시 시작되도록 설정된 서비스와 지연 후 자동으로 시작되도록 설정된 서비스를 포함하므로 서버가 시작된 후 몇 분 후에 이 스크립트를 시작하도록 적극 권장합니다. .

2.) 모니터링에 관심이 없는 이 한 줄의 서비스를 통해 반환되는 서비스가 있을 것입니다. (내 노트북에서는 "TrustedInstaller"라는 서비스가 이 기준에 맞고 중지된 서비스로 반환되었습니다 :/) 따라서 이러한 서비스도 필터링해야 할 가능성이 높습니다.

답변3

서비스 > 속성 > 복구

여기에 이미지 설명을 입력하세요

서비스 다시 시작 또는 명령 실행을 포함하여 처음 3번의 실패 시 수행할 작업을 선택할 수 있습니다.

이곳은 당신도 사용할 곳입니다프로그램 실행서비스를 다시 시작하는 스크립트를 설정하고, 파일을 지우고, 알림을 보내는 등의 작업을 수행합니다. 저는 NMS(Zabbix) 또는 Powershell 스크립트를 선호하지만 이 중 대부분은 기본적으로 해결될 수 있으며 GPO(귀하의 환경에 적용 가능한 경우)는 필요한 모든 서비스/머신에 걸쳐 이 설정을 갖습니다.

답변4

나에게 딱 맞는 Powershell 스크립트를 찾았습니다. 약간만 사용자 정의하면 됩니다. 여기 링크가 있습니다http://doitcloudy.blogspot.de/2014/07/scriptgesteuerter-neustart-von-windows.html(독일어이지만 페이지 하단의 스크립트는 모두 영어입니다.) 하지만 이 부분(130행 이하)에 대해서는 도움이 필요합니다.

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)

}

스크립트가 서비스를 시작하는 부분인 것 같은데 Powershell 작업이 익숙하지 않습니다. 서비스 시작이 실패할 때 서비스 이름을 로그 파일에 기록하도록 스크립트를 어떻게 편집해야 합니까? 어쩌면 try/catch를 사용할까요?

편집하다:

누군가 이 문제를 우연히 발견하고 어떻게 해결했는지 알고 싶다면: 많은 연구 끝에 나는 Receiver-Job의 출력을 로그 파일에 기록하는 것이 매우 어렵다는 것을 알게 되었습니다. 그래서 저는 다른 접근 방식을 선택했습니다. 작업이 완료된 후 서버가 실행 중인지 확인하는 것입니다. 코드는 다음과 같습니다.

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" }

}

관련 정보