当前位置: 代码迷 >> C# >> 检测Windows服务是不是正常运行
  详细解决方案

检测Windows服务是不是正常运行

热度:92   发布时间:2016-05-05 03:20:25.0
检测Windows服务是否正常运行
局域网中的一台服务器上有几个用C#写的Windows服务,如何在本机监测该服务器上的Windows服务是否正常运行?谢谢! 
------解决思路----------------------
服务本身是悄无声息地运行着,就是服务器上也只能判断一下状态,是否真的正常运行那只能看业务逻辑了。
楼主要从另外一台电脑上进行判断,那就要在服务器上安个眼线,不如再写一个服务来做这个事吧,呵呵。
------解决思路----------------------
实现TCP服务端,客户端去连接,能连接上就是正常呗
------解决思路----------------------
ServiceController sc = new ServiceController("服务名称");
switch (sc.Status)
{
    case ServiceControllerStatus.Running:
        Console.WriteLine("运行");
        break;
    case ServiceControllerStatus.Stopped:
        Console.WriteLine("停止");
        break;
    case ServiceControllerStatus.Paused:
        Console.WriteLine( "暂停");
        break;
    case ServiceControllerStatus.StopPending:
        Console.WriteLine( "正在停止");
        break;
    case ServiceControllerStatus.StartPending:
        Console.WriteLine("正在开启");
        break;
    default:
        Console.WriteLine("状态正在变化");
        break;
}

------解决思路----------------------
  /// <summary>
        /// 判断服务是否存在
        /// </summary>
        /// <param name="serviceName"></param>
        /// <returns></returns>
        public static bool ServiceIsExisted(string serviceName)
        {
            ServiceController[] services = ServiceController.GetServices();
            foreach (ServiceController s in services)
            {
                if (s.ServiceName == serviceName)
                {
                    return true;
                }
            }
            return false;
        }

------解决思路----------------------
更具体点说吧。

一个服务系统,可能每秒都会写几百条日志,显然是不能让其塞满网络带宽的。所以日志都是存在本地(例如.net程序中使用 EventLog 机制写到windows日志系统中)。当你需要查看日志时,你可能需要向所有机器发送一个命令(例如包括任务编号、要查看的操作名、故障类型、时间段,等信息)给所有的服务器,然后各个服务器分别推送一组日志记录,最后再生成一个查询画面所需要的合并报告。这个操作可能需要0.5秒钟(假设服务器数量不超过50台的话)。

也就说你的客户端程序通常是这样的编程模式:展示支持用户编辑查询条件的画面,异步地发送命令到master主机,然后向用户展示一个“正在查询”的画面,当收到消息知道操作的结果已经产生了之后则访问master主机的服务接口区拉取结果、产生图文的画面。

这是针对通用的服务器事件日志查询机制而言的。

而通常可以有一个非常精简的小表,记录各个服务器的“心跳”消息。各个服务器在心跳时本身就会报告一些信息,例如服务器的地址、机器名、进程数、线程数、虚拟内存数、应用程序的GC实际分配了多少内存、最近2、3次心跳的时间、最后一次测试数据读和写的速度值、启动后一共运行了多久(x天y小时z分钟),等等信息。这是随着某个核心的任务调度系统的心跳机制而传送到master机器上的。这种信息直接从master机器上读取就行了,不用到各个服务器的日志去查询了。
------解决思路----------------------
引用:
...
3#、4#的代码明显可以检测windows服务的状态,和业务逻辑没什么关系嘛。


3#、4#只能检测本机的服务,不能检测远程机器(服务器)。

ServiceController倒是有一个重载,可以指定远程机器的名字。
但在实际应用中,由于安全设定的差别,机器之间的信任关系等,基本可以认为是不可靠的(除非你同时负责客户的IT管理)。

另外,楼主的”Windows服务是否正常运行“本身没有准确的定义。
因此1楼的“判断一下状态”,不能说错;‘看业务逻辑‘也不能说错。
  相关解决方案