環境内に、更新プログラムを自動的にインストールし、その後再起動するサーバー(Windows Server 2012 R2)がいくつかあります。
再起動後、自動起動に設定されているすべての(Windows)サービスのステータスを確認したいと思います。サービスが開始されなかった場合、スクリプトはサービスの開始を3回試行し、すべての試行が失敗した場合は、このサーバー上のこのサービスの問題を確認できるように、電子メール通知を送信する必要があります。
簡単な解決策、おそらくPowerShellスクリプトがすでに存在するのだろうかと思っていました。
自分にぴったりの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の出力をログファイルに書き込むのは非常に難しいことがわかりました。そこで、別のアプローチを選択しました。ジョブの終了後にサーバーが実行されているかどうかを確認します。コードは次のとおりです。
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" }
}
NMSの入手を検討することをお勧めします。私たちはPRTGを使用しており、それはうまく機能します。その中で、WMIを使用してWindowsサービスを監視するセンサーを作成できます。サービスがダウンした場合にメール/開始スクリプトを送信するようにセンサーを構成できます。
PRTGはセンサーによってライセンスされていますが、無料バージョンでは100が提供されます。これは、2台のサーバーに十分なはずです(監視するには、サービスごとに1つのセンサーが必要です)
Powershellは、これらのサービスを監視するための優れた方法です。奇妙なことに、私は今日これについてのブログを読んでいました。スクリプトを見つけたらリンクしようとしますが、一般的な要点は次のとおりです。
1.)自動的に開始するように設定されているサービスを検索します。
2.)サービスの状態を確認します。
秘訣は
get-service
コマンドレットは「StartupType」を出力しないため、代わりにWin32_ServiceWMIオブジェクトを使用する必要があります。
Foreach($Server in $ServerList){
Get-WmiObject -ComputerName $Server Win32_Service |
Where-Object {$_.StartMode -eq 'Auto' -AND $_.State -eq 'Stopped'}
}
これにより、必要なパラメータに適合するサービスのリストが表示されます。
[〜#〜] notes [〜#〜]これにはいくつかの注意事項があります。
1。)$ _。StartMode-eq'Auto 'には、起動直後に開始するように設定されたサービスと、遅延後に自動的に開始するように設定されたサービスが含まれるため、サーバーの起動後数分でこのスクリプトを開始することを強くお勧めします。 。
2.)おそらく監視を気にしないこのワンライナーを介して返されるサービスがあります。 (つまり、私のラップトップでは、「TrustedInstaller」というサービスがこの基準に適合し、停止したサービスとして返されました:/)したがって、これらも除外する必要がある可能性があります。