我有一组旧版Windows服务。所有这些服务都安装在多个服务器上,但由于某些原因(例如内存泄漏,文件系统异常和SQL连接异常),服务可能已关闭。所以我们必须远程服务器并每天检查服务的状态。虽然添加了恢复操作。但它仍然不稳健,可控。
我想找到的解决方案是,将所有这些存在的服务集成到一个Windows服务中。此主机服务可以运行子服务并安排它们并监视它们,当发生错误时,我的主机服务可以恢复,将错误记录到数据库并向相关人员发送电子邮件。该解决方案还可以让我安排服务,例如停止,定期设置。所以我想知道有没有一种方法我不需要修改从servicebase继承并将它们集成到我的框架的现有Windows服务的程序集。我认为操作系统可以托管子服务,我的主机服务或框架工作必须能够托管子服务并安排它们。
我的最终目标是只有一个Windows服务,它是我的主机服务。其他子服务在我的服务下运行而没有安装到操作系统。
我在下面挖了一些相关的帖子,但它们不符合我的要求:
答案 0 :(得分:0)
当您说服务时,您是指正确的服务或可执行文件转换为服务?如果是后者,你可以完全控制它。您可以将子服务生成为线程甚至进程。最大的问题是杀死进程。随着Windows操作系统的每个新版本的发布,它们都会添加越来越多的安全功能,这使得很难杀掉进程。
线程可能是一个问题,如果一个线程由于内存泄漏而死亡,它会影响程序。整个程序可能必须自行关闭并重新启动。
警告提示:服务以名为“本地用户”的用户身份运行。您无法以“本地用户”身份登录,即使作为最高管理员(称为管理员),您也无法终止“本地用户”服务或进程。只有“本地用户”可以杀掉它们。
您是否看过像firedaemon这样的共享软件产品?他们做了类似的事情。
答案 1 :(得分:0)
所以我想知道有没有办法我不需要修改程序集 从servicebase继承的现有Windows服务 将它们集成到我的框架
听起来你不想修改现有代码,所以我想说到目前为止最简单和最有效的解决方案是编写一个监视其他代码的单独服务。
ServiceController类包含检查其他服务状态所需的所有功能,而无需诉诸sc
或其他实用程序调用。
您可以使用要监控的服务列表维护.txt文件或.xml文件。
string[] servicesToWatch = GetServiceList();
foreach (string service in servicesToWatch)
{
try
{
ServiceController sc = new ServiceController(service);
if (sc.Status != ServiceStatus.Running)
{
sc.Start();
sc.WaitForStatus(ServiceStatus.Running, TimeSpan.FromMinutes(2));
// log to database that service was restarted
}
}
catch (Exception e)
{
// log to database that service could not be started
// send emails to necessary people
}
}
然后,您可以将上述代码放入计时器或while循环中,每隔x分钟检查一次。