クラッシュしたWindowsサービスを自動的に再起動するにはどうすればよいですか?


57

数日ごとに予期せず終了するWindowsサービスがあります。クラッシュした場合に迅速に再起動されるように監視する簡単な方法はありますか?

回答:


77

サービスアプリケーションの下で、問題のサービスのプロパティを選択します。

回復タブを表示-あらゆる種類のオプションがあります-サービスを再起動するために最初と2番目の失敗を設定し、3番目の失敗通知でBLATが電子メールを送信するバッチプログラムを実行します。

また、Failカウントを毎日リセットするには、Reset Fail Countを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 Notify@Example.com -server SMTP.Example.com -f Administrator@Example.com

3
すべて良いものですが、特に電子メール通知のアドバイスとコマンドラインのものについては+1です。
マキシマスミニマス

バッチファイルはディスクのどこに保存する必要がありますか?
マット

どこでも。ではSC failure w3svc command= "MyBatchFile.cmd"、それはパスやCにする必要があります:\ WINDOWS \ System32に。完全なパスを使用する場合、任意のディレクトリにそれを置くことができますSC failure w3svc command= "c:\Stuff\MyBatchFile.cmd"
クリストファー

9

Services.mscを開き、サービスをダブルクリックしてサービスの[プロパティ]を開きます。[回復]タブがあり、これらの設定により、障害発生時にサービスを再起動できます。


4

回復時間をゼロに設定してみてください。

ここに画像の説明を入力してください

同等のコマンドライン:

SC failure YOUR_SERVICE_NAME reset= 0 actions= restart/0/restart/0/restart/0

とにかく、自動回復が正しく機能しない場合があり、サードパーティのソフトウェアを使用することをお勧めします。0ウィンドウの終了コードでサービスが正常に終了すると、サービスを回復しようとしないようです。


1

私が使用していますServiceKeeperを HostForLife.euで私の窓2008サーバー上で、それは非常に良い作品。以前、ServiceHawkのレビューがありましたが、管理とインターフェイスが簡単なServiceKeeperを使用することを好みます。


1

停止した場合、サービスを開始するという同様の要件がありました。私が考えた最も簡単な解決策は、5分ごとにWindowsタスクスケジューラで以下のコマンドを実行することでした。

ネットスタートMyServiceName

このコマンドは基本的にサービスを開始し(停止した場合)、サービスが既に実行されている場合は効果がありません。


1

私は最近、定義された回数のサービスの再起動を試行し、最後に電子メール通知を送信するpowershellスクリプトを実行する回復オプションを実装しました。

いくつかの試みの後(そして、私が見た他のすべてのことにもかかわらず)、サービスの回復タブのフィールドの構成は次のとおりです。

プログラム:Powershell.exe
** Not C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \ Powershell.exe

コマンドラインパラメーター:-command "&{SomePath \ YourScript.ps1 '$ args [0]' '$ args [1]' '$ args [n]'}"

例:-command "&{C:\ PowershellScripts \ ServicesRecovery.ps1 'サービス名'}"

** $ 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 = "Name@domain.com"
$FromAddress = "Name@domain.com"

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 = "Name@domain.com"
$FromAddress = "Name@domain.com"

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

0

これは同様のスレッドに関する私の答えでしたこれが役立つことを願っています...

このような単純なvbsスクリプトをスケジュールして、必要に応じてコンピューターのサービスを定期的に再起動できます。

strComputer = "。" 
strSvcName = "YOUR_SERVICE_NAME" 
set objWMI = GetObject( "winmgmts:\\"&strComputer& "\ root \ cimv2")
set objService = objWMI.Get( "Win32_Service.Name = '"&strSvcName& "'")
objService.State = "Stopped" Ifの場合
    objService.StartService()
終了する



0

スーパーユーザーに誰かが同様の質問をしました。Windowsサービスを監視するツールをインストールできます。Service Hawkのようなものは、サービスの開始を維持したり、自動再起動(おそらく夜間)をスケジュールして、サービスを円滑に実行したりするのに役立ちます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.