如果程序崩溃,可以自动重启程序吗?
就像是:
我想为我正在处理的服务器应用程序的这种行为。 如果客户端错过使用服务器,它可以得到一个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服务,所以帮助程序停止服务(最终杀死它,如果它挂起),并再次启动服务。