自动重启Windows服务

4

我正在尝试使用C#编写一个Windows服务,它应该始终运行。如果发生崩溃或关闭,则应自动重新启动。我考虑使用Service Controller类,但问题是如何处理Service Controller和Service同时崩溃的情况。

在Windows中是否有看门狗功能,可以注册并负责服务的启动?


只是一个想法:也许可以使用Windows计划任务,在每分钟执行控制台应用程序,检查服务状态并在未运行时启动。 - Damith
可能是 在 Windows 服务上设置恢复选项 的重复问题。 - Alexander Manekovskiy
3个回答

11

您可以考虑使用服务的恢复选项。当运行services.msc时,可以通过服务属性进行设置。

请参阅此处此处了解更多信息。


1

除了上述推荐的模式外,可能订阅appdomain.unhandledexception事件捕获未处理的异常是个好主意。并卸载应用程序域,这样Windows服务管理器将启动恢复过程。

AppDoamin.currentAppDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionHandler);


void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e)
{
       Environment.Exit(-1);
}

0
一个推荐的模式是将服务启动选项设置为“自动”,并确保您的服务的核心功能被包装在try/catch块中。
try 
{
 // core code here.
} 
catch (Exception ex)
{
 // log it for debugging and swallow so that service doesn't crash.
}

这可以确保您的服务始终运行。代码不会使其崩溃,并且当机器重新启动等情况发生时,服务会自动启动。


吞咽异常是不可取的。 - fsimonazzi
@fsimonazzi 我应该表述得更清楚。控制台应用程序、Windows 服务等最外层块需要防止未处理的异常,否则进程会死亡。而防止此类未处理崩溃的一种可能方法是在最外层级别上放置 try/catch,并清晰地记录异常。基本上是处理异常(而不是吞噬它)。我的上面的答案意味着解释如何处理它。我使用“吞咽”这个词只是因为我们没有抛出它或让它冒泡。我们正在处理它。 - Raja Nadar
1
根据我的经验,这仍然是不可取的。最好将服务设置为自动重新启动(请参见@pepo的答案),然后终止可执行文件。这样你就可以确保干净地重新启动。我曾花费很多时间调试由于“处理”和内部重新启动服务而引起的问题,我认为这不值得。 - Rob H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接