如果程序崩溃,是否可以自动重启程序?
类似的东西:
对于我正在处理的服务器应用程序,我希望这种行为。如果客户端错过使用服务器,它可以获得std :: bac_alloc异常,在这种情况下,我希望服务器只需重启而不是崩溃和关闭,从而避免手动启动。
答案 0 :(得分:6)
我之前在Windows中通过win32 CreateProcess调用从另一个程序运行所述程序来完成此操作。然后另一个程序等待“受监视”进程退出,如果有,则再次调用CreateProcess()
。您可以通过对流程'句柄执行WaitForSingleObject来等待流程退出,您可以将其作为CreateProcess()
来电中的返回值之一。
您当然希望以某种方式进行编程,以使监控过程自行关闭,并将子进程关闭。
答案 1 :(得分:4)
让Windows成为您的监督者。您可以致电ChangeServiceConfig2
为您的服务设置失败操作。 (如果您的服务器不是服务,那么您做错了。)为SERVICE_CONFIG_FAILURE_ACTIONS
参数指定dwInfoLevel
,并在SERVICE_FAILURE_ACTIONS
结构中设置lpsaActions
到一个或多个SC_ACTION
值的数组。您想要的类型是SC_ACTION_RESTART
。
答案 2 :(得分:3)
我通过实施看门狗做了类似的事情。看门狗作为一项服务运行,并将等待来自受监控进程的ping(称为抚摸狗)。如果受监视的进程因异常而死亡,则看门狗将清理并重新启动应用程序。
如果应用程序没有响应(在一定时间内没有ping),监视程序将终止它然后重新启动它。
以下是您可能想要使用的实现的链接: http://www.codeproject.com/KB/security/WatchDog.aspx
(PS:我实现了自己的版本,但我不能在这里发布。我通过快速谷歌搜索找到了这个,并没有这个特定实现的第一手经验。)
答案 3 :(得分:1)
如果您只是捕获异常,应该可以通过内部编程逻辑重新启动服务器,而无需完全重新启动整个程序。
答案 4 :(得分:1)
与@ T.E.D。一样,我们在我们构建的应用程序中完成了这项工作。我们的应用程序是一个Windows服务,所以帮助程序停止服务(最终杀死它,如果它挂起)并再次启动服务。