![자동 서비스가 시작되지 않은 경우 이메일 알림(Windows Server 2012 R2)](https://rvso.com/image/668797/%EC%9E%90%EB%8F%99%20%EC%84%9C%EB%B9%84%EC%8A%A4%EA%B0%80%20%EC%8B%9C%EC%9E%91%EB%90%98%EC%A7%80%20%EC%95%8A%EC%9D%80%20%EA%B2%BD%EC%9A%B0%20%EC%9D%B4%EB%A9%94%EC%9D%BC%20%EC%95%8C%EB%A6%BC(Windows%20Server%202012%20R2).png)
우리 환경에는 업데이트를 자동으로 설치하고 그 후에 다시 시작하는 서버(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
답변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" }
}