您的位置:首页 > 运维架构

蛙蛙推荐:编写一个服务监控及管理的软件

2008-02-17 17:36 761 查看
蛙蛙推荐:编写一个服务监控的软件

如果一个服务被部署到了几十台机器上,我们往往需要每天花费很多的时间去查看每台机器上的服务的运行状况,虽然微软有MOM(Microsoft Operations Manager)和SMS(Systems Management Server),但处于成本上及其它方面的考虑,好多时候我们还用不上这些东西,其实微软公开了好多管理和监控方面的API和工具,比如WMIC,System.Managerment等,把这些零散的API和工具集中起来,便可以开发一些满足自定义需求的小软件。

我们要实现以下任务

1、确认指定的进程已启动

2、获取指定机器,指定进程的CPU、内存、线程使用情况

3、确认指定机器的指定端口在监听

4、获取指定机器指定计数器的情况

5、获取指定机器上的系统日志/应用日志

6、获取指定服务相关trace

7、确认指定服务的功能拨测能通过

8、抓取指定机器指定进程的dump

9、在指定机器上进行网络抓包

10、重启指定机器上的某服务,某应用程序进程池等

下面来一一考虑一下

1、确认指定的进程已启动

可以用WMI接口来获取远程机器的进程列表,然后遍历这个列表,确认指定服务的进程名字是否在这个列表里,核心代码(来自网络)如下:

public static DataTable RunningProcesses()

public class PerfCounter

public class PerfCounterHelper

List<PerfCounter> counters = new List<PerfCounter>();

counters.Add(new PerfCounter("Processor", "% Processor Time", "_Total", "."));

counters.Add(new PerfCounter("Memory", "Pages/sec", "", "."));

Console.WriteLine(PerfCounterHelper.GetPerfCount(counters));


其实获取每个进程的内存,线程,CPU等信息,用WMI查询Win32_Process也可以得到,但像CPU等信息还要往出算,所以简单的办法就是通过计数器获取了

3、确认指定机器的指定端口在监听

一般提供网络接口的服务都要监听一个或者几个端口,我们手工来确认端口是否监听的时候一般是登录到那台机器上运行netstat -na | find "LISTENING"来查看输出,或者在本机上用telnet 192.168.0.1 80来看是否能打开,其实我们用程序也能调用者两个命令,但是调用远程机器上的netstat命令,你一般没办法获取它的输出,通常的办法是把输出结果用命名管道重定向到某个文件,然后以编程的方式去访问网络路径去取这个文本文件并读取文本,这种方式太麻烦。而以编程的方式调用telnet需要交互,也很麻烦,所以我们用socket来建立一个连接来测试远程端口是否在监听,大约如下

public static bool IsListenPort(string remoteHost, int port)

public static string ping(string remoteHost)

public static string Telnet(string remoteHost, int port)

public class EventLogHelper

public static void Execute(string command)

On Error Resume Next

strComputer = "."

Set objWMIService = GetObject("winmgmts:" _

& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colItems = objWMIService.ExecQuery("Select * from Win32_NetworkAdapter where NetConnectionStatus =2")

For Each objItem in colItems

Wscript.Echo "Name: " & objItem.Name

Next


dumpcap.exe的-i参数解释如下,有了网络适配器的名字或者索引就可以抓包了

-i <interface> name or idx of interface (def: first none loopback)

10、重启指定机器上的某服务,某应用程序进程池等

重启服务可以先停止,后启动,wmic命令如下,可用程序来执行

::停止spooler服务

wmic SERVICE where name="Spooler" call stopservice

::运行spooler服务

wmic SERVICE where name="Spooler" call startservice

获取某web应用的应用程序池的代码如下

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\MicrosoftIISv2")

Set colItems = objWMIService.ExecQuery( _

"SELECT * FROM IIsWebVirtualDirSetting",,48)

For Each objItem in colItems

Wscript.Echo "Name: " & objItem.Name & " -> Pool: " & objItem.AppPoolId

Next

获取后就可以进行对指定应用程序池的回收操作了,回收应用程序进程池代码大约如下,来自网络,未测试

internal class RecycleAppPool

{

{

ManagementScope scope = new ManagementScope("root\\MicrosoftIISv2");

scope.Connect();

ManagementObject appPool =

new ManagementObject(scope,

new ManagementPath("IIsApplicationPool.Name='W3SVC/AppPools/DefaultAppPool'"), null);

appPool.InvokeMethod("Recycle", null, null);

Console.WriteLine("Recycled DefaultAppPool");

}

}


更多的IIS管理操作可以使用Adsutil.vbs

这以上的一切都是为了集中的管理,而不用一个一个的登录到远程机器上去操作。综合以上这些东西,可以写一个综合的管理工具,在一条机器上就可以管理几十台机器,获取某几台机器的运行状况报表,远程重启多台服务器的某服务等。

WMIC:从命令行对Windows的全面管理
http://www.yesky.com/20030424/1665552.shtml
WMIC Process Call Create
http://wmug.co.uk/blogs/r0b/archive/2007/10/12/wmic-process-call-create.aspx
WMIC 全新的超级命令行管理工具
http://tech.sina.com.cn/other/2003-05-20/1702189076.shtml
一些wmic例子
http://blog.vkill.net/read.php?41
Can one recycle an application from a script in IIS 6.0?
http://blogs.iis.net/chrisad/archive/2006/08/30/Recycling-Application-Pools-using-WMI-in-IIS-6.0.aspx
关于 WMIC 的使用
http://bbs.hackerxfiles.net/viewthread.php?tid=91580
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: