在未处理的exception上重新启动应用程序

如果程序崩溃,可以自动重启程序吗?

就像是:

  1. 抛出未处理的exception。
  2. 释放进程分配的所有资源。
  3. 重新开始并打电话给main。

我想为我正在处理的服务器应用程序的这种行为。 如果客户端错过使用服务器,它可以得到一个std :: bac_allocexception,在这种情况下,我希望服务器只需重新​​启动,而不是崩溃和closures,从而避免手动启动。

我之前在Windows中通过win32 CreateProcess调用从另一个程序运行所述程序。 然后另一个程序等待“监视”进程退出,如果有,则再次调用它的CreateProcess() 。 通过在进程的句柄上执行一个WaitForSingleObject ,你可以等待一个进程退出,你可以从你的CreateProcess()调用中得到一个返回值。

您当然会想要以某种方式进行编程,以使监控进程自行关闭,并让其子进程关闭。

让Windows成为你的看门狗。 您可以调用ChangeServiceConfig2来为您的服务设置失败操作 。 (如果你的服务器不是服务,那么你做错了。)为dwInfoLevel参数指定SERVICE_CONFIG_FAILURE_ACTIONS ,在SERVICE_FAILURE_ACTIONS结构中,将lpsaActions设置为一个或多个SC_ACTION值的数组。 你想要的类型是SC_ACTION_RESTART

我通过实现一个看门狗来做类似的事情。 看门狗作为服务运行,并等待被监视进程中的ping(称为宠物狗)。 如果受监视的进程因异常而死亡,看门狗将清理并重新启动应用程序。

如果应用程序没有响应(在一定的时间内没有ping),看门狗会杀死它,然后重新启动它。

这里是一个你可能想要使用的实现的链接: http : //www.codeproject.com/KB/security/WatchDog.aspx

(PS:我实现了我自己的版本,但是我不能在这里发布,我从一个快速的谷歌搜索中找到了这个,并且没有亲身体验这个特定的实现。)

如果您只是发现异常,应该可以通过内部编程逻辑重新启动服务器,而不必重新启动整个程序。

像@TED一样,我们在一个我们建立的应用程序中做了这个。 我们的应用程序是一个Windows服务,所以帮助程序停止服务(最终杀死它,如果它挂起),并再次启动服务。