0

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

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

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

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

4

2 回答 2

0

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

于 2013-03-27T07:07:34.897 回答
0

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

线程可能是一个问题,如果一个线程由于内存泄漏而死,它会影响程序。整个程序可能不得不自我关闭并重新启动。

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

你看过像firedaemon这样的共享软件产品吗?他们做类似的事情。

于 2013-03-27T06:23:12.760 回答