数日おきに突然終了するWindowsサービスがあります。クラッシュした場合にすばやく再起動することを確認する簡単な方法はありますか?
サービスアプリケーションで、問題のサービスのプロパティを選択します。
回復タブを表示-あらゆる種類のオプションがあります-サービスを再起動するように最初と2番目の失敗を設定し、3番目は [〜#〜] blat [〜#〜] のバッチプログラムを実行しますは、3番目の失敗の通知を電子メールで送信します。
また、失敗カウントを毎日リセットするには、失敗カウントのリセットを1に設定する必要があります。
編集:
コマンドラインからこれを行うことができるように見えます:
SC failure w3svc reset= 432000 actions= restart/30000/restart/60000/run/60000
SC failure w3svc command= "MyBatchFile.cmd"
MyBatchFile.CMDファイルは次のようになります。
blat - -body "Service W3svc Failed" -subject "SERVICE ERROR" -to [email protected] -server SMTP.Example.com -f [email protected]
Services.mscを開き、サービスをダブルクリックしてサービスのプロパティを開きます。[回復]タブがあり、これらの設定により、障害時にサービスを再起動できます。
停止した場合にサービスを開始するという同様の要件がありました。私が考えた最も簡単な解決策は、Windowsタスクスケジューラで以下のコマンドを5分ごとに実行することです。
ネットスタートMyServiceName
このコマンドは基本的にサービスを開始し(停止した場合)、サービスが既に実行されている場合は効果がありません。
HostForLife.euのWindows 2008サーバーで ServiceKeeper を使用していますが、非常にうまく機能します。以前は、ServiceHawkのレビューをしていましたが、ServiceKeeperを使用して管理とインターフェイスを簡単にしたいと思っています。
最近、PowerShellスクリプトを実行して定義された回数だけサービスの再起動を試み、最後にメール通知を送信する回復オプションを実装しました。
数回試行した後(および他のすべてのものを見たにもかかわらず)、サービスの[リカバリ]タブのフィールドの構成は次のとおりです。
プログラム:Powershell.exe
** C:\ Windows\System32\WindowsPowerShell\v1.0\Powershell.exeではない
コマンドラインパラメーター:-command "&{SomePath\YourScript.ps1 '$ args [0]' '$ args [1]' '$ args [n]'}"
例:-command "&{C:\ PowershellScripts\ServicesRecovery.ps1 'Service Name'}"
** $ argsは、スクリプトに渡されるパラメーターです。これらは必須ではありません。
これがpowershellスクリプトです:
cd $PSScriptRoot
$n = $args[0]
function CreateLogFile {
$events = Get-EventLog -LogName Application -Source SomeSource -Newest 40
if (!(Test-Path "c:\temp")) {
New-Item -Path "c:\temp" -Type directory}
if (!(Test-Path "c:\temp\ServicesLogs.txt")) {
New-Item -Path "c:\temp" -Type File -Name "ServicesLogs.txt"}
$events | Out-File -width 600 c:\temp\ServicesLogs.txt
}
function SendEmail {
$EmailServer = "SMTP Server"
$ToAddress = "[email protected]"
$FromAddress = "[email protected]"
CreateLogFile
$Retrycount = $Retrycount + 1
send-mailmessage -SmtpServer $EmailServer -Priority High -To $ToAddress -From $FromAddress -Subject "$n Service failure" `
-Body "The $n service on server $env:COMPUTERNAME has stopped and was unable to be restarted after $Retrycount attempts." -Attachments c:\temp\ServicesLogs.txt
Remove-Item "c:\temp\ServicesLogs.txt"
}
function SendEmailFail {
$EmailServer = "SMTP Server"
$ToAddress = "[email protected]"
$FromAddress = "[email protected]"
CreateLogFile
$Retrycount = $Retrycount + 1
send-mailmessage -SmtpServer $EmailServer -Priority High -To $ToAddress -From $FromAddress -Subject "$n Service Restarted" `
-Body "The $n service on server $env:COMPUTERNAME stopped and was successfully restarted after $Retrycount attempts. The relevant system logs are attached." -Attachments c:\temp\ServicesLogs.txt
Remove-Item "c:\temp\ServicesLogs.txt"
}
function StartService {
$Stoploop = $false
do {
if ($Retrycount -gt 3){
$Stoploop = $true
SendEmail
Break
}
$i = Get-WmiObject win32_service | ?{$_.Name -imatch $n} | select Name, State, StartMode
if ($i.State -ne "Running" -and $i.StartMode -ne "Disabled") {
sc.exe start $n
Start-Sleep -Seconds 35
$i = Get-WmiObject win32_service | ?{$_.Name -imatch $n} | select State
if ($i.state -eq "Running"){
$Stoploop = $true
SendEmailFail}
else {$Retrycount = $Retrycount + 1}
}
}
While ($Stoploop -eq $false)
}
[int]$Retrycount = "0"
StartService
スーパーユーザーで同様の質問が誰かから寄せられました。Windowsサービスを監視するツールをインストールできます。 Service Hawk のようなものは、サービスを開始したままにしたり、サービスをスムーズに実行し続けるために(おそらく夜間に)自動再起動をスケジュールしたりするのに役立ちます。
これは同様の thread に対する私の答えでした。
このような単純なvbsスクリプトをスケジュールして、必要に応じてコンピューター上のサービスを定期的に再起動できます。
strComputer = "。" strSvcName = "YOUR_SERVICE_NAME" set objWMI = GetObject( "winmgmts:\\"&strComputer& "\ root\cimv2") set objService = objWMI.Get( "Win32_Service .Name = '"&strSvcName&"' ") If objService.State =" Stopped "Then objService.StartService() End If