我们在我们的环境中有几台服务器(Windows Server 2012 R2),它们会自动安装更新并在此之后重新启动。
重启后,我们想检查所有设置为自动启动的(Windows)服务的状态。 如果一个服务没有启动,脚本会尝试启动服务3次,如果所有的尝试失败,它应该发送一个电子邮件通知,以便我们可以检查这个服务在这个服务器上有什么问题。
我想知道是否已经有一个简单的解决scheme,也许是一个PowerShell脚本?
我build议你看看获得一个NMS。 我们使用PRTG,效果很好。 在其中,您可以创build使用WMI监视Windows服务的传感器。 如果服务closures,您可以将传感器configuration为发送邮件/启动脚本。
PRTG由传感器许可,但免费版本为您提供了100个,这对于几台服务器来说应该足够了(每个服务需要一个传感器来监视)
Powershell将是监视这些服务的好方法。 奇怪的是,我今天刚刚读了一篇关于这个的博客。 如果我能find它,我会尝试链接脚本,但是它的一般要点是:
1.)查找设置为自动启动的服务。
2.)检查服务的状态。
诀窍在于
get-service
cmdlet不会输出任何types的“StartupType”,所以您将不得不使用Win32_Service WMI对象。
Foreach($Server in $ServerList){ Get-WmiObject -ComputerName $Server Win32_Service | Where-Object {$_.StartMode -eq 'Auto' -AND $_.State -eq 'Stopped'} }
这应该为您提供适合您所需参数的服务列表。
注意这里有几个注释:
1.)我强烈build议你在服务器启动后几分钟内启动这个脚本,因为$ _。StartMode -eq“Auto”将包含在启动后立即启动的服务,以及设置为在延迟后自动启动的服务。
2.)将有一些服务将通过这个单线程返回,你可能不关心监控。 (在我的笔记本电脑上,一个名为“TrustedInstaller”的服务符合这个标准,并作为一个停止的服务返回:/)所以你最有可能也需要过滤掉这些。
服务>属性>恢复
可以select前3次失败的操作,包括重新启动服务或运行命令。
这是你也可以使用运行程序来设置你的脚本,将重新启动服务,清除文件,发送给你一个通知等我所有的NMS(Zabbix)或Powershell脚本,但其中大部分可以本地解决和GPO(如果适用于您的环境)可以在所有必需的服务/机器中设置此设置。
我发现一个完美的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?
编辑:
如果有人绊倒在这,并想知道我是如何解决它的:经过大量的研究,我发现将Receive-Job的输出写入日志文件是非常困难的。 所以我select了一种不同的方法:在作业完成后检查服务器是否在运行。 代码如下:
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" } }