【问题标题】:Can I host multiple different windows services in a single windows service?我可以在一个 Windows 服务中托管多个不同的 Windows 服务吗?
【发布时间】:2013-03-17 03:59:30
【问题描述】:

我有一组旧版 Windows 服务。所有这些服务都安装在多台服务器上,但服务可能由于某些原因而关闭,例如内存泄漏、文件系统异常和 sql 连接异常。因此,我们必须每天远程检查服务器并检查服务的状态。虽然添加了恢复操作。但它仍然不是健壮的、可控的。

我想找到的解决方案是将所有这些现有服务集成到一个 windows 服务中。该主机服务可以运行子服务并对其进行调度和监控,当发生错误时,我的主机服务可以恢复,将错误记录到数据库并发送电子邮件给相关人员。该解决方案还可以使我定期安排服务,例如停止,设置。所以我想知道有没有一种方法我不需要修改从服务库继承的现有 Windows 服务的程序集并将它们集成到我的框架中。我认为操作系统可以托管子服务,必须有一种方式让我的主机服务或框架也可以托管子服务并安排它们。

我的最终目标是只有一个 windows 服务,它是我的主机服务。其他子服务在我的服务下运行,没有安装到操作系统。

我在下面挖了一些相关的线程,但它们不能满足我的要求:

【问题讨论】:

  • @leppie 根据我的阅读,您不能将 svchost 用于您自己的服务,stackoverflow.com/questions/849613/…。 Scott,您能否向我们提供有关您希望共同托管的服务的更多信息?它们都是用 .NET 编写的吗?你有他们的源代码吗?
  • @Despertar。 Windows 服务是用 .Net 编写的。我有它们的源代码。但这太多了,其中一些可能在我成为程序员之前就已经存在。 :) 所以,除非必须,否则我不想接触源代码。

标签: .net windows-services


【解决方案1】:

当您说服务时,您是指适当的服务或转换为服务的可执行文件吗?如果是后者,则您可以完全控制它。您可以将子服务生成为线程甚至进程。最大的问题是终止进程。随着 Windows 操作系统的每个新版本,他们添加了越来越多的安全功能,这使得杀死进程变得困难。

线程可能是一个问题,如果一个线程由于内存泄漏而死,它会影响程序。整个程序可能必须自行终止并重新启动。

注意事项:服务以称为“本地用户”的用户身份运行。您无法以“本地用户”身份登录,即使是最高管理员(称为管理员),您也无法终止“本地用户”服务或进程。只有“本地用户”才能杀死他们。

您是否了解过firedaemon 等共享软件产品?他们做类似的事情。

【讨论】:

  • 非常感谢您的回复。我提到的子服务是适当的服务。实际上,除了这个子窗口服务,我还有几十个窗口计划任务。这些计划任务运行可执行应用程序。这些可执行文件已添加到我的服务框架中。我在单线程中运行它们,但是将线程包装为“ExceptionSafeThread”,一个线程崩溃不会停止其他线程。因此可以避免内存泄漏问题。您提到的最后一个问题是停止线程的权限,我的设计是让主机服务(“本地用户”)停止它们。
【解决方案2】:

所以我想知道有没有一种方法我不需要修改程序集 从服务库继承的现有 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
    }
}

然后您可以将上述代码放入计时器或每 x 分钟检查一次的 while 循环中。

【讨论】:

  • 非常感谢您的回复。目前,我的 Service Framewrok 可以监控现有的 windows 服务。它可以重新启动失败的服务,也可以给相关人员发送邮件。正如您所建议的,我用来监控服务状态的是 ServiceController。但这还不够。下一步,我们需要卸载所有现有的 Windows 服务并集成到我的服务框架中。我们可以完全控制。
猜你喜欢
  • 2020-11-24
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多