局域网中的一台服务器上有几个用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#只能检测本机的服务,不能检测远程机器(服务器)。
ServiceController倒是有一个重载,可以指定远程机器的名字。
但在实际应用中,由于安全设定的差别,机器之间的信任关系等,基本可以认为是不可靠的(除非你同时负责客户的IT管理)。
另外,楼主的”Windows服务是否正常运行“本身没有准确的定义。
因此1楼的“判断一下状态”,不能说错;‘看业务逻辑‘也不能说错。