- 浏览: 214423 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
microwindlab:
你不应该加 --shell 参数,因为 --shell run ...
由mongodb的维护引发的 grep,awk,sed 与管道的应用 -
Jerryhome:
楼主超牛,值得好好学习
windows系统下的进程监测程序--实现过程记录 -
xb_91674981:
学习一下,模式在程序设计是很重要
《大话设计模式》一书的所有代码和UML类图 -
Jason(aijun):
正在学习,非常感谢分享。
《大话设计模式》一书的所有代码和UML类图 -
wurb_travelsky:
正在看这本书,C#的代码倒也不影响阅读
《大话设计模式》一书的所有代码和UML类图
单位的客服中心的服务器有个接口程序,这三天都出现了自动退出的情况,这接口程序是管理打进来的电话分配到各值班的客服人员那里,接口程序是由其他公司开发的,以前也出现过自动退出的情况,但开发方一直没给出解决方案。
由于这接口一退出,那外面的用户就打不进电话来,结果用户就投诉到领导那里,领导就骂下面的员工。。。(低人一级就得挨骂,哎)
最近三天频繁自动退出,我就产生自己开发一个监测该接口程序的程序。当接口程序自动退出时,就重启服务。本来用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(<ime); 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; }
发表评论
-
w3school html 学习笔记
2014-04-25 20:38 877当显示页面时,浏览 ... -
phpcms 笔记
2014-04-24 16:53 819Phpcms v9的pc_webserver一安装上,就不 ... -
dive into python 笔记
2014-02-13 17:23 619第三章 tuple 是没有app ... -
python 爬某高校C++题库小程序
2014-01-18 15:44 1388最近在学习C++,爬下一些题来,用于平时练手。 原理其实也 ... -
centos下饭强--obfucated-openssh sshcenter.info
2013-09-26 21:47 14981. git clone https://github.com ... -
android的【qq通讯录】导出短信,在iphone上恢复
2013-07-14 22:00 5921事件经过:朋友原来用android手机,现在新买了ipho ... -
python的一些记录
2013-05-03 13:53 1143正则表达式的一些常用元字符和语法: http://www. ... -
《程序设计导引及在线实践》学习
2012-05-31 17:13 999P41 int MyItoa(char s[]) 将s中以 ... -
accelerated c++ 学习笔记
2012-04-26 00:53 1166Chapter 0 A namespace is a ... -
关于foreach与普通for的区别
2012-04-10 22:07 1286请问两者的区别 for(A a : alist) { ... -
学习Linux命令,读《系统程序员成长计划》
2012-03-06 16:41 1300linux命令小结: cat : ... -
base64,日期操作,jexl读取excel
2012-03-06 16:40 215407-22:学习base64的加密和解密,求几天前的日期和求两 ... -
无题。。好代码记录
2011-12-27 11:35 737编写函数expand(s1,s2),将字符串s1中类似于a-z ... -
数据结构:排序
2011-11-09 13:08 909排序一般分为:插入排序,选择排序,交换排序,归并排序和分配排序 ... -
c语言复习笔记
2011-11-07 17:24 2081指针部分: 1.指针类型说明 main(){ in ... -
并发学习笔记(更新中,java编程思想第四版21章)
2011-10-19 23:47 1548实现并发最直接的方式是在操作系统级别使用进程。 并发任 ... -
并发学习笔记(更新中,java编程思想第四版21章)
2011-10-19 21:05 0从今天起记录学习到的知识。 -
RMI 入门
2011-10-07 16:23 1514RMI : remote method invocation, ... -
《大话设计模式》一书的所有代码和UML类图
2011-08-29 16:08 4249如题,把《大话设计模式》一书的所有代码和UML类图写出来,见附 ... -
发短信算法题
2011-05-10 20:49 1109发短信:手机短信通常a个字就分一页,分页之前在短信之前都要加上 ...
相关推荐
35. perfmon.msc----计算机性能监测程序 36. winver---------检查Windows版本 37. sfc /scannow-----扫描错误并复原 38. taskmgr-----任务管理器(2000/xp/2003) 39. regsvr32 /u *.dll----停止dll文件运行 40....
内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...
内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...
Windows的设计允许程序在不受足够的限制的情况下垄断您的CPU,从而导致系统停滞和反映滞后。ProBalance根据需求智能调节运行的程序的优先次序,从而使不良进程不会对您的PC的响应产生负面影响。这一目的并非通过提高...
Windows的设计允许程序在不受足够的限制的情况下垄断您的CPU,从而导致系统停滞和反映滞后。ProBalance根据需求智能调节运行的程序的优先次序,从而使不良进程不会对您的PC的响应产生负面影响。这一目的并非通过提高...
内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...
内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...
内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...
内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...
第7章 操作系统与Windows相关程序 324 7.1 启动相关 325 实例233 进入Windows系统前发出警告 325 实例234 实现注销、关闭和重启计算机 326 7.2 获得磁盘属性 328 实例235 获得硬盘序列号 328 实例236 获取...
本软件程序界面友好、操作方式简单直观,无论普通用户还是网络管理员都能使用自如。其中独特的 多任务模式,多个功能可同时工作,有效节省时间。 Net Tools X 功能包括了: 网络扫描类:端口扫描、共享扫描、MAC ...
第7章 操作系统与Windows相关程序 324 7.1 启动相关 325 实例233 进入Windows系统前发出警告 325 实例234 实现注销、关闭和重启计算机 326 7.2 获得磁盘属性 328 实例235 获得硬盘序列号 328 实例236 获取...
Process Monitor是一个高级的 Windows 系统和应用程序监视工具,由优秀的 Sysinternals 开发,并且目前已并入微软旗下,可靠性自不用说。 此版本的 Process Monitor 增加了多项重要增强功能,包括稳定性和性能改进...
监测ip和网址连通的c#代码 通过配置文件配置需要监测的计算机的名称和ip地址,需要配置要监测的计算机的数目 通过配置文件配置需要监测的网址的名称和网址址,需要配置要监测的网址的数目 ...可以扩展监测及重启进程
新版本的防火墙使用独创的内存分配系统,程序占用系统资源极小,占用内存480-1000K以内,是天网防火墙的五分之一,是目前国内乃至世界占用内存最小的防火墙程序,其功能也能匹敌专业的收费防火墙,所有的升级服务...
第7章 操作系统与Windows相关程序 324 7.1 启动相关 325 实例233 进入Windows系统前发出警告 325 实例234 实现注销、关闭和重启计算机 326 7.2 获得磁盘属性 328 实例235 获得硬盘序列号 328 实例236 获取...