`

windows系统下的进程监测程序--实现过程记录

阅读更多

单位的客服中心的服务器有个接口程序,这三天都出现了自动退出的情况,这接口程序是管理打进来的电话分配到各值班的客服人员那里,接口程序是由其他公司开发的,以前也出现过自动退出的情况,但开发方一直没给出解决方案。

由于这接口一退出,那外面的用户就打不进电话来,结果用户就投诉到领导那里,领导就骂下面的员工。。。(低人一级就得挨骂,哎)

 

最近三天频繁自动退出,我就产生自己开发一个监测该接口程序的程序。当接口程序自动退出时,就重启服务。本来用java的话,我觉得挺简单的,但服务器上没装jdk,一般服务器不能乱装程序的,我就打消了用java实现的念头,后来一想,其实用linux的命令也很简单,写个shell脚本,几行命令就行了,但服务器是用windows server系统,杯了个具。

 

只能用原始的c语言了。

刚开始时,用c语言实现第一件做的事是:google一下有无c语言版的监测进程程序,当然没有啦,天下哪有这么好的事,拿来就可以用。。。

就转变思路,要监测一个进程,那就要获取当前的进程列表,像进程管理器那样。再找google一下:c语言 获取系统进程

也是没结果。。。

再想一下,如果用java,我就会通过Runtime.exec()来执行dos命令,同理,用c语言怎样执行dos命令呢,找到方法了:

system(char* commandStr);这函数可以用。

第二步是怎样获取系统进程?这个简单一google就知道用dos里的:tasklist命令。

获取了之后就要解析获取到的进程列表,问题又来了,system()函数调用的返回结果是Int,表示执行结果状态。所以我就另辟蹊径,把tasklist的结果重定向到txt文件,再用c语言读文件,本来这里我是想用一条命令就把进程那一行获取出来的,但无奈windows系统不支持管道,还是linux系统牛B啊。

好了,在获取系统当前运行的进程后,就通过dos的一条命令:findstr(类似于linux的find),找出我监测的进程,

再把结果存入一个临时文件里

接下来的工作就是读文件,若文件是0行,则代表监测的进程没启动,这时就启动该进程,若文件有1行,就代表程序正在运行,就等待5分钟再检测。如果文件有大于1行,代表启动多个进程,这是不允许的情况,就先把所有的进程关闭,再开一个进程。

 

程序代码如下:(程序以记事本为demo,notepad.exe)

 
#include<stdio.h>
#include<time.h>
#include <#include<stdio.h>
#include<time.h>
#include <windows.h>

#define listFileName "C:\\dsir.txt"
#define recordFileName "c:\\record.txt"
#define tmpFileName "c:\\tmpProcess.txt"
#define processName "notepad.exe"
#define maxCharOneLine 100
#define sleepSeconds (1000*8)
#define toExeProcess "notepad.exe"
#define processImageName "NOTEPAD.EXE"

int openFile(FILE*,char*,char*);
char* getTime();
int getLineCount(char*);

//算法:检测列表文件存在否,存在就删除;
//进入循环:获取当前进程列表,保存入列表文件;
//查找列表文件有否Dsir程序,若只有一个则记录文件写入正常,若没有则记录异常,并尝试重启服务 
//若多于一个则记录多个运行,并尝试关闭所有,然后开启一个。暂停5分钟,继续循环 
//sleep(); sprintf(); tasklist; system()
main(){
	FILE *listFile;
	FILE *recordFile;
	char getProcessesCmd[50];
	char findDsirCmd[100];
	char* line;
	int lineCount = 0;
	
	if((recordFile = fopen(recordFileName,"a+")) == NULL){ //record file not exist
		printf("fail to open record file\n");
		exit(-1);
	}
	fprintf(recordFile,"%s %s\n",getTime(),"begin to record");
	if((listFile = fopen(listFileName,"r")) != NULL){ //if list file exist,del it
		fprintf(recordFile,"%s %s\n",getTime(),"delete old dsir.txt");
		fclose(listFile);
		if(remove(listFileName)){ 
			fprintf(recordFile,"%s %s\n",getTime(),"remove list file fail\n");
			exit(-1);
		}
	}
	
	if(listFile != NULL){
		printf("close list file\n");
		fclose(listFile);
	}
	if(recordFile != NULL){
		printf("close record file\n");
		fclose(recordFile);
	}
	
	char killProcessCmd[100];
	sprintf(getProcessesCmd, "tasklist /nh > %s", listFileName);
	sprintf(killProcessCmd, "taskkill /im %s", processImageName);
	sprintf(findDsirCmd, "findstr /c:%s %s > %s",processName,listFileName,tmpFileName);
	
	while(1){
		//get and save current processes into listFile
		system(getProcessesCmd);
		Sleep(1000L);
		system(findDsirCmd);
		
		lineCount = getLineCount(tmpFileName);
		printf("lineCount: %d\n",lineCount);
		
		if(lineCount == 0){ // start one process
			fprintf(recordFile,"%s %s\n",getTime(),"start this process\n");
			system(toExeProcess);
		}else if(lineCount == 1){ //ok status
			fprintf(recordFile,"%s %s\n",getTime(),"single process running\n");
		}else if(lineCount > 1){ //too many processes, kill all and start one
			fprintf(recordFile,"%s %s\n",getTime(),"too many processes running\n");
			system(killProcessCmd);
			Sleep(1000L);
			system(toExeProcess);
		}
		
		lineCount = 0;
		
		Sleep(sleepSeconds);
	}
	
	if(listFile != NULL){
		printf("close list file\n");
		fclose(listFile);
	}
}

int openFile(FILE *fp, char *str, char *mode){
	fp = fopen(str,mode);
	printf("%s status:%d\n",str,fp);
	return fp==NULL ? 0 : 1;
}

char timeStr[50];
char* getTime(){
	struct tm *newtime;
	long ltime;
	ltime = time(NULL);
	newtime = localtime(&ltime);
	sprintf(timeStr, "%4d年%2d月%2d日%2d时%2d分%2d秒",newtime->tm_year + 1900,newtime->tm_mon + 1,newtime->tm_mday,
	newtime->tm_hour, newtime->tm_min, newtime->tm_sec);
	return timeStr;
}

int getLineCount(char* fName){
	char c;
	int h = 0;
	FILE *fp = fopen(fName,"r");
	if(fp == NULL){
		return -1;
	}
	while((c = fgetc(fp)) != EOF){
		if(c == '\n'){
			h++;
		}else{
			c = fgetc(fp);
			if(c == EOF){
				h++;
				break;
			}
		}
	}
	fclose(fp);
	return h;
}
 
 

 

 

分享到:
评论
1 楼 Jerryhome 2011-08-30  
楼主超牛,值得好好学习

相关推荐

    Windows系统下监控进程并自动重启

    在Windows操作系统环境中,确保应用程序或特定进程持续稳定运行是非常重要的,特别是在那些对系统服务至关重要的情况下。本话题将深入探讨如何实现"Windows系统下监控进程并自动重启"这一功能,以及如何利用提供的...

    csharp-Windows服务及进程监控程序

    本项目“csharp-Windows服务及进程监控程序”提供了一个C#编写的解决方案,它能够监测指定的Windows服务和系统进程,如果发现它们没有运行,程序会自动尝试启动这些服务或进程。 首先,让我们了解一下Windows服务。...

    windows进程监听程序

    综上所述,"Windows进程监听程序"涉及到Windows操作系统的核心进程管理机制,结合了编程技术如异常处理、多线程和日志记录等,以确保关键服务或应用的持续运行。开发者需要深入理解Windows API,并具备一定的编程...

    守护进程,程序异常死机后自动重启

    本文将探讨如何在Windows环境下,使用C++编程语言创建一个守护进程应用程序,以实现程序异常死机后的自动重启功能。 首先,我们需要理解Windows中的服务模型。在Windows中,服务是一种可以在用户登录之前启动并独立...

    进程监测及自动执行_进程_监测_

    在Windows环境下,可以使用`Task Scheduler`创建定时任务,或者编写Windows Service来定期启动进程。C#中,`System.ServiceProcess`命名空间提供了创建和控制服务的类。创建服务并设置定时启动可以实现进程的自动...

    C#控制台实现的一个简单的守护进程程序

    在Windows系统中,我们可以使用服务(Service)来实现类似的功能,但在控制台环境下,我们可以创建一个简单的模拟守护进程的应用。 该程序的核心功能在于监测目标程序(ProductExe)的运行状态。在C#中,这可以通过...

    基于C++ QT实现windows下进程监控程序源码,实时获取进程的内存,cpu 基于QT实现的windows下任务管理器源码

    在本文中,我们将深入探讨如何使用C++与Qt框架在Windows环境下实现一个进程监控程序,类似于Windows的任务管理器。这个程序能够实时监测并显示进程的内存占用和CPU使用情况,同时还具备动态调整查询间隔、保存日志...

    winfrom Windows服务监控exe进程,启动exe窗体应用程序

    而Windows服务则是在没有用户交互的情况下长时间运行的程序,通常用于后台任务和系统级功能。本话题关注的是如何通过C#编程,让一个WinForm应用程序(Windows服务)监控另一个exe进程,并在需要时启动该exe的窗体...

    windows进程监控

    Windows进程监控是一个强大的系统诊断工具,它允许用户实时跟踪和分析系统中运行的进程对文件系统和注册表的操作。ProcessMonitor是微软开发的一款免费工具,它整合了早期的FileMon和RegMon,提供了全面的系统活动...

    进程崩溃自动重启

    在Windows操作系统中,.exe文件是程序的主要执行部分,当这些进程崩溃时,自动重启功能可以帮助快速恢复服务。 实现进程崩溃自动重启的方法多种多样,以下是一些常见的策略: 1. **操作系统的内置功能**:某些操作...

    C#进程监控,监视程序是否崩溃、死锁?

    C#作为.NET框架下的主要编程语言,提供了丰富的工具和类库来实现进程监控。本文将深入探讨如何使用C#来监控进程状态,包括监测程序是否崩溃和发生死锁,并讨论如何通过托盘图标进行无声的后台监控。 一、C#进程监控...

    计算机病毒与防护:进程监测工具ProcessExplorer.ppt

    1. 进程监测:Process Explorer可以实时监视Windows系统和应用程序的运行情况,显示当前系统中的进程和线程列表,包括进程的名称、PID、内存占用、 CPU 使用率等信息。 2. 安全检查:Process Explorer提供了安全检查...

    java开发的一个windows的远程监控软件

    标题中的“java开发的一...总的来说,这个Java开发的Windows远程监控软件结合了Java编程语言的跨平台优势,实现了对Windows系统的远程监控功能,涵盖了多种监控及管理操作,并且在开发过程中可能运用了多种技术和工具。

    windows进程监控java版

    本篇文章将深入探讨基于Java的Windows进程监控软件的实现原理、核心功能以及实际应用。 1. **Java与Windows进程监控** Java的可移植性使得开发者可以利用相同的代码在不同的操作系统上进行进程监控。在Windows平台...

    操作系统安全:安全审计,Windows系统日志详解,Windows事件ID汇总.txt

    Windows系统日志是Windows操作系统内置的一种日志记录工具,用于记录系统运行过程中的各种事件。通过这些日志,管理员能够更好地了解系统的运行状态、用户的活动情况以及可能存在的安全事件等关键信息,从而有效预防...

    可以监视内存的进程,如果消失不存在,则可以重新启动该应用程序。达到崩溃恢复的目的。

    标题和描述中提到的"可以监视内存的进程,如果消失不存在,则可以重新启动该应用程序",这是一种典型的进程监控与自动恢复机制,常见于服务器管理和分布式系统中。 进程监视器(Process Monitor)是一种工具,它...

    windows下抓包程序

    在Windows操作系统中,抓包程序是一种用于监测网络通信并记录数据包的工具。这些工具能够帮助网络管理员、开发者和安全专家分析网络流量,排查问题,或者进行网络安全审计。本篇文章将详细探讨如何利用MFC...

    操作系统—进程管理实验报告

    通过本次实验,旨在加强学生对进程这一基本概念的理解,掌握进程与程序之间的区别,理解并发执行的本质,并通过具体操作熟悉Windows操作系统下的进程管理功能。 #### 实验目的 1. **深化进程概念的理解**:通过...

    Delphi写的守护进程(服务程序)

    在IT领域,守护进程和服务程序是操作系统中不可或缺的部分,它们常在后台运行,确保关键任务的稳定执行。本文将深入探讨如何利用Delphi编程语言来创建一个守护进程,该进程能够监控并自动重启指定的应用程序。 ...

    windows下的监控程序

    总结来说,"windows下的监控程序"即AppWatcher是一个用于Windows平台的守护进程工具,其核心功能是监测指定的.exe程序,确保其稳定运行,一旦出现异常则自动重启,并记录详细的运行状态,为系统的可靠性和维护提供...

Global site tag (gtag.js) - Google Analytics