it-swarm.cn

如果Windows服务崩溃,如何自动重新启动它?

我有一个Windows服务,每隔几天会意外退出。有没有一种简单的方法来监视它,以确保它在崩溃时迅速重新启动?

57
Liam

在“服务”应用程序下,选择有问题的服务的属性。

查看恢复选项卡-有各种各样的选项-我将“第一次和第二次失败以重新启动服务”设置为“第三次”,以运行 [〜#〜] blat [〜#〜] 发出了一封带有第三个失败通知的电子邮件。

您还应该将“重置失败计数”设置为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]
79
Christopher_G_Lewis

打开Services.msc,双击该服务以打开该服务的属性,其中有一个“恢复”选项卡,并且这些设置应允许您在失败时重新启动该服务。

9
jeremyasnyder

尝试将恢复时间设置为零:

enter image description here

等效命令行:

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

无论如何,有时自动恢复无法正常工作,因此建议使用第三方软件。似乎当服务退出且退出代码为0时,Windows不会尝试恢复它。

4
MSS

如果停止,我也有启动服务的类似要求。我认为最简单的解决方案是每5分钟在Windows Task Scheduler中执行以下命令:

净启动MyServiceName

此命令基本上将启动服务(如果已停止),并且如果该服务已经在运行,则该命令无效。

1
Anderson

我在Windows 2008服务器上的HostForLife.eu上使用 ServiceKeeper ,它的效果很好。以前,我曾对ServiceHawk进行过评论,但我更喜欢使用ServiceKeeper来简化管理和界面。

1
Play_Park

我最近实现了一个恢复选项,以运行Powershell脚本,该脚本尝试按规定的次数重新启动服务,并在结束时发送电子邮件通知。

经过几次尝试(尽管我已经看过所有其他事情),服务中“恢复”选项卡上的字段配置如下:

程式:Powershell.exe
**不是C:\ Windows\System32\WindowsPowerShell\v1.0\Powershell.exe

命令行参数:-command“&{SomePath\YourScript.ps1'$ args [0]''$ args [1]''$ args [n]'}”

例如:-命令“&{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 = "[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
1
Nick

有人在“超级用户”处提出了类似的问题:您可以安装监视Windows服务的工具。 Service Hawk 之类的东西可以帮助您保持服务的启动,或者允许您安排自动重新启动(可能在夜间)以保持服务的平稳运行。

0
ExtraLean

这是我对类似 thread 的回答,希望这会有所帮助...

您可以安排一个像这样的简单vbs脚本,以便在需要时定期重新启动计算机上的服务。

 strComputer =“。” 
 strSvcName =“ YOUR_SERVICE_NAME” 
 set objWMI = GetObject(“ winmgmts:\\”&strComputer&“\root\cimv2”)
 set objService = objWMI.Get(“ Win32_Service .Name ='“&strSvcName&”'“)
如果objService.State =” Stopped“,则
 objService.StartService()
结束If 


0
Maxwell