Window下的简单监控程序的编写

本文介绍 windows 下监控程序的作用以及其应用场景, 然后结合简 要实例给出演示程序

1 介绍

什么是监控程序 监控程序是对指对某个运行中的程序的行为进行监控, 比如 监控网络接口是否有数据到达, 程序是否异常退出, 上网记录有 等等。

有哪些应用场景 按照应用的业务不同, 需要用到监控的地方特别的多, 比如 视频监控、 上网行为监控、 网络运营设备监控、 程序行为监控、 公共交通监控等等。

为什么引入监控 监控的可以持续的记录数据, 方便后期数据分析, 如在某段 时间出现了什么故障, 根据监控的行为数据以及现象, 可以定位 出产生问题的软硬件部件, 另从根本上解放了人的重复工作量。

2 理解监控及如何编写

既然是监控, 那么程序必然要一直在运行着, 从软件层面上来说, 监控程序其实就是一直存在并运行着的程序, 其存在形式一般是进程中 的定时器任务、 线程任务、 以及服务组件等。

可通过如下几种实现方式实现:

a) 各种程序实现均可达到目的,如 .Net、 C/C++、 Java、 Python 等等都可以实现。

b) 利用系统的脚本程序实现, windows 下可以通过 VBScript、 Autobat、 PowerShell 等; unix-like 系统则可以依据系统提供 的 bash 实现。

c) 可编写系统驱动来实现

3 平台差异性考虑移植

用户层面的应用程序移植是没有多大问题的, 可以考虑跨平台开发语言 如 JAVA , 跨平台C++ 开发框架 如 QT, 以及本身就不依赖特定系 统的语言 如 Python等。 自行调用特定系统下的API的, 必须要考虑为每种系统下提供实现, 否则程序不可移植。

凡涉及到内核层面的程序, 也是不可以移植的, 如驱动, 这部分 需要依据特定系统, 定制开发。

4 程序实现举例

通过windows 批处理实现监控, 当程序退出后, 再重新启动。

@echo off::检测时间间隔,单位:秒
set _interval=5::需要守护的进程所在目录与启动命令
set _processDir="C:\Program Files (x86)\Youdao\Dict\"
set _processCmd=YoudaoDict.exe::需要守护的进程预估启动完毕所需时间,单位:秒
set _processTimeout=1:LOOP
set /a isAlive=false
tasklist | find /C "%_processCmd%" > temp.txt
set /p num= < temp.txt
del /F temp.txtif "%num%" == "0" (
start /d %_processDir% %_processCmd%| echo start %_processCmd% at %time%
choice /D y /t %_processTimeout% > nul
)if "%num%" NEQ "0" echo %_processCmd% is running
choice /D y /t %_interval% >nul
goto LOOP

通过windows 下 C++ 以及Win32 Api 实现监控程序, 用于监控 CPU当前利用率、 内存信息等, 建立的是Console 控制台应用。

INT GetCpuUsage( INT seconds) { FILETIME preidleTime; FILETIME prekernelTime; FILETIME preuserTime; GetSystemTimes(&preidleTime, &prekernelTime, &preuserTime);HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE,NULL);WaitForSingleObject(hEvent, 1000); CloseHandle(hEvent);FILETIME idleTime; FILETIME kernelTime; FILETIME userTime; GetSystemTimes(&idleTime, &kernelTime, &userTime);auto compareTime = [](FILETIME time1, FILETIME time2) {__int64 a = time1.dwHighDateTime << 32 | time1.dwLowDateTime; __int64 b = time2.dwHighDateTime << 32 | time2.dwLowDateTime; return (b - a); };DWORD idle = compareTime(preidleTime, idleTime); DWORD kernel = compareTime(prekernelTime, kernelTime); DWORD user = compareTime(preuserTime, userTime);INT usage = kernel + user - idle) * 100 / (kernel + user);return usage;
}LPCTSTR FormatErrorId(DWORD errID) { LPVOID lpMsgBuf = NULL; if (!FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |                     FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errID,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR)&lpMsgBuf, 0, NULL)){return NULL; } return (LPCTSTR)lpMsgBuf;
}void ResetCursorPos(HANDLE hConsoleOuput, const COORD& newPos)
{ SetConsoleCursorPosition(hConsoleOuput, newPos);
}void ClearBuffer(HANDLE hBuffer) { DWORD dwWritten = 0;CONSOLE_SCREEN_BUFFER_INFO csb; if (!GetConsoleScreenBufferInfo(hBuffer, &csb)) { return; }COORD maxBufferSize = csb.dwMaximumWindowSize;COORD cord; cord.X = 0; cord.Y = 0;FillConsoleOutputCharacter(hBuffer, _T(' '), maxBufferSize.X * maxBufferSize.Y, cord, &dwWritten);
}DWORD WINAPI SysInfoProc( LPVOID lpParam) {tagSysInfoParam* pSysInfoParam = (tagSysInfoParam*)lpParam; while (true) { TCHAR header[1024] = { 0 }; TCHAR body[1024] = { 0 };INT usage = GetCpuUsage(1000);MEMORYSTATUSEX memory; ZeroMemory(&memory, sizeof(memory)); memory.dwLength = sizeof(memory);GlobalMemoryStatusEx(&memory);DWORD dwMemoryLoad = memory.dwMemoryLoad; DOUBLE dwAvailMemory = (DOUBLE)memory.ullAvailPhys / 1024 / 1024 / 1024;                          DOUBLE dwTotalPageFile = (DOUBLE)memory.ullTotalPageFile / 1024 / 1024 / 1024;         DOUBLE dwAvailPageFile =  (DOUBLE)memory.ullAvailPageFile / 1024 / 1024 / 1024;_stprintf_s(header, _T("CPU 利用率\t内存消耗率\t可使用内存\t总的页面大小\t可用页面大            小\n")); _stprintf_s(body,_T("%d%%\t\t%d%%\t\t%fGB\t%fGB\t%fGB\n"), usage, dwMemoryLoad, dwAvailMemory, dwTotalPageFile, dwAvailPageFile);COORD cord; cord.X = 0; cord.Y = 0;ClearBuffer(pSysInfoParam->hOutput); ResetCursorPos(pSysInfoParam->hOutput, cord);WriteData(pSysInfoParam->hOutput, header); WriteData(pSysInfoParam->hOutput, body);
}int main() {HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_SCREEN_BUFFER_INFO csb; if (!GetConsoleScreenBufferInfo(hOutput, &csb)) { LogOutput(hOutput, GetLastError()); return -1; }SMALL_RECT mr; mr.Left = 0; mr.Top = 0; mr.Right = 80; mr.Bottom = 5;if (!SetConsoleWindowInfo(hOutput, TRUE, &mr )) { LogOutput(hOutput, GetLastError()); return -1; }int cxMin = GetSystemMetrics(SM_CXMIN); int cxMax = GetSystemMetrics(SM_CYMIN);COORD cursorPos; cursorPos.X = 0; cursorPos.Y = 0;tagSysInfoParam param; DWORD dwThreadId; param.hOutput = hOutput;HANDLE hThread = CreateThread(NULL, 2048, SysInfoProc, (LPVOID)&param, 0, &dwThreadId);WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread);
}

以上代码在平台 WIndows 10 下, 开发环境为 Microsoft Visual Studio 2017 Console 正常运行, 代码中可能会存在错误, 欢迎批评指正, 另需要全的的代码的朋友可在 http://doc.getdreamspace.top/file/4199436-426170808  下载。

CPU 内存实时监控程序相关推荐

  1. 一个用了统计CPU 内存 硬盘 使用率的shell脚本

    一个用了统计CPU 内存 硬盘 使用率的shell脚本 一个统计 CPU 内存 硬盘 使用率的shell脚本,供大家学习参考 代码如下: #!/bin/bash #This script is use ...

  2. Linux下CGroup进行CPU内存等资源控制

    留存 from: http://www.cnblogs.com/kevingrace/p/5685433.html  and  http://www.cnblogs.com/wang_yb/p/394 ...

  3. centOS7下实践查询版本/CPU/内存/硬盘容量等硬件信息

    https://www.cnblogs.com/zy-plan/p/8617202.html 1.系统 1.1版本 uname -a 能确认是64位还是32位,其它的信息不多 [root@localh ...

  4. CentOS7 查询版本/CPU/内存/硬盘容量等命令

    1.系统 1.1版本 uname -a 能确认是64位还是32位,其它的信息不多 [root@ecs-681b ~]# uname -a Linux ecs-681b 3.10.0-1062.9.1. ...

  5. 内存屏障(cpu内存屏障 与java内存屏障)

    文章目录 CPU 内存屏障 定义 读写屏障指令 为什么会出现内存屏障 java内存屏障 java内存屏障存在意义 java中内存屏障的主要类型 LoadLoad 屏障 StoreStore 屏障 Lo ...

  6. Linux 查看CPU 内存 IO使用率,linux 查看CPU内存 网络 流量 磁盘 IO

    使用vmstat命令来察看系统资源情况 在命令行方式下,如何查看CPU.内存的使用情况,网络流量和磁盘I/O? Q: 在命令行方式下,如何查看CPU.内存的使用情况,网络流量和磁盘I/O? A: 在命 ...

  7. deepin(深度linux)dde-dock系统监控小插件(网速CPU内存)

    转载自deepin(深度linux)dde-dock系统监控小插件(网速CPU内存),仅用作个人学习备份,Mark一下 花了一周时间,研究了dde-dock官方插件开发文档和sonichy大神的项目, ...

  8. 如何查看linux网络io,linux 查看CPU内存 网络 流量 磁盘 IO

    使用vmstat命令来察看系统资源情况 在命令行方式下,如何查看CPU.内存的使用情况,网络流量和磁盘I/O? Q: 在命令行方式下,如何查看CPU.内存的使用情况,网络流量和磁盘I/O? A: 在命 ...

  9. KVM - 调整cpu内存、网卡

    1.查看母机里面的子机情况 [root@bogon ~]# virsh list --all Id    Name                           State ---------- ...

最新文章

  1. Handler研究2-AsyncTask,AsyncQueryHandler分析
  2. python软件是免费的吗-7年程序员贡献出来的10大Python开源免费工具!
  3. [PWA] Show Notifications when a Service Worker is Installed or Updated
  4. Linux中查看日志文件的正确姿势,求你别tail走天下了!
  5. think php a方法,ThinkPHP之A方法实例讲解_PHP
  6. python pip国内源
  7. 【转】Docker 容器化核心概念
  8. 工作4年工资8K,还有什么理由不努力?
  9. [转载] python classmethod存在的意义_@classmethod和@staticmethod对初学者的意义?
  10. 【javascipt】Generator函数(生成器)
  11. C/C++ 取整函数
  12. 数据挖掘概念与技术(原书第三版)范明 孟小峰译-----第二章课后习题答案
  13. 软件质量属性:易用性
  14. 上银驱动器使用手册_上银伺服电机调试说明书PPT课件
  15. MQL5中的错误处理和日志记录
  16. ubuntu给手机刷机安卓8.0 ROOT+Xposed+JustTrustMe+Kali NetHunter
  17. 2022新版UI聚合支付系统四方系统源码+修复漏洞完美版
  18. 【清华大学陈渝】第三章 计算机体系结构
  19. 疯狂填词 mad_libs 第9章9.9.2
  20. php 读取图片bgr,快速解决cv2.imread()读取图像为BGR的问题

热门文章

  1. 对 flask 的 jsonify 方法的理解
  2. linux下三个好用的终端分屏工具
  3. 【紫光同创国产FPGA教程】【第二十三章】千兆以太网传输实验
  4. 安卓手机管理软件_VAA云录音系统_VAA云录音app下载手机版 v1.1.9 最新版
  5. 592.分数加减运算 纯纯的数学题,Python 7行代码+详细思路分享!
  6. 表格基本格式1128
  7. 高端课后晚托品牌“文启优思”获数千万A+轮融资,源道投资、高思教育、柏宏锐尔合投... 1
  8. 微信小程序健身记录管理
  9. 图解BUCK开关电源——同步整流和异步整流
  10. 利用tushare获取A股收盘价并画图