- 浏览: 218556 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
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 914当显示页面时,浏览 ... -
phpcms 笔记
2014-04-24 16:53 870Phpcms v9的pc_webserver一安装上,就不 ... -
dive into python 笔记
2014-02-13 17:23 660第三章 tuple 是没有app ... -
python 爬某高校C++题库小程序
2014-01-18 15:44 1441最近在学习C++,爬下一些题来,用于平时练手。 原理其实也 ... -
centos下饭强--obfucated-openssh sshcenter.info
2013-09-26 21:47 15441. git clone https://github.com ... -
android的【qq通讯录】导出短信,在iphone上恢复
2013-07-14 22:00 5971事件经过:朋友原来用android手机,现在新买了ipho ... -
python的一些记录
2013-05-03 13:53 1217正则表达式的一些常用元字符和语法: http://www. ... -
《程序设计导引及在线实践》学习
2012-05-31 17:13 1043P41 int MyItoa(char s[]) 将s中以 ... -
accelerated c++ 学习笔记
2012-04-26 00:53 1203Chapter 0 A namespace is a ... -
关于foreach与普通for的区别
2012-04-10 22:07 1332请问两者的区别 for(A a : alist) { ... -
学习Linux命令,读《系统程序员成长计划》
2012-03-06 16:41 1351linux命令小结: cat : ... -
base64,日期操作,jexl读取excel
2012-03-06 16:40 220307-22:学习base64的加密和解密,求几天前的日期和求两 ... -
无题。。好代码记录
2011-12-27 11:35 775编写函数expand(s1,s2),将字符串s1中类似于a-z ... -
数据结构:排序
2011-11-09 13:08 971排序一般分为:插入排序,选择排序,交换排序,归并排序和分配排序 ... -
c语言复习笔记
2011-11-07 17:24 2137指针部分: 1.指针类型说明 main(){ in ... -
并发学习笔记(更新中,java编程思想第四版21章)
2011-10-19 23:47 1595实现并发最直接的方式是在操作系统级别使用进程。 并发任 ... -
并发学习笔记(更新中,java编程思想第四版21章)
2011-10-19 21:05 0从今天起记录学习到的知识。 -
RMI 入门
2011-10-07 16:23 1566RMI : remote method invocation, ... -
《大话设计模式》一书的所有代码和UML类图
2011-08-29 16:08 4301如题,把《大话设计模式》一书的所有代码和UML类图写出来,见附 ... -
发短信算法题
2011-05-10 20:49 1155发短信:手机短信通常a个字就分一页,分页之前在短信之前都要加上 ...
相关推荐
在Windows操作系统环境中,确保应用程序或特定进程持续稳定运行是非常重要的,特别是在那些对系统服务至关重要的情况下。本话题将深入探讨如何实现"Windows系统下监控进程并自动重启"这一功能,以及如何利用提供的...
本项目“csharp-Windows服务及进程监控程序”提供了一个C#编写的解决方案,它能够监测指定的Windows服务和系统进程,如果发现它们没有运行,程序会自动尝试启动这些服务或进程。 首先,让我们了解一下Windows服务。...
综上所述,"Windows进程监听程序"涉及到Windows操作系统的核心进程管理机制,结合了编程技术如异常处理、多线程和日志记录等,以确保关键服务或应用的持续运行。开发者需要深入理解Windows API,并具备一定的编程...
本文将探讨如何在Windows环境下,使用C++编程语言创建一个守护进程应用程序,以实现程序异常死机后的自动重启功能。 首先,我们需要理解Windows中的服务模型。在Windows中,服务是一种可以在用户登录之前启动并独立...
在Windows环境下,可以使用`Task Scheduler`创建定时任务,或者编写Windows Service来定期启动进程。C#中,`System.ServiceProcess`命名空间提供了创建和控制服务的类。创建服务并设置定时启动可以实现进程的自动...
在Windows系统中,我们可以使用服务(Service)来实现类似的功能,但在控制台环境下,我们可以创建一个简单的模拟守护进程的应用。 该程序的核心功能在于监测目标程序(ProductExe)的运行状态。在C#中,这可以通过...
在本文中,我们将深入探讨如何使用C++与Qt框架在Windows环境下实现一个进程监控程序,类似于Windows的任务管理器。这个程序能够实时监测并显示进程的内存占用和CPU使用情况,同时还具备动态调整查询间隔、保存日志...
而Windows服务则是在没有用户交互的情况下长时间运行的程序,通常用于后台任务和系统级功能。本话题关注的是如何通过C#编程,让一个WinForm应用程序(Windows服务)监控另一个exe进程,并在需要时启动该exe的窗体...
Windows进程监控是一个强大的系统诊断工具,它允许用户实时跟踪和分析系统中运行的进程对文件系统和注册表的操作。ProcessMonitor是微软开发的一款免费工具,它整合了早期的FileMon和RegMon,提供了全面的系统活动...
在Windows操作系统中,.exe文件是程序的主要执行部分,当这些进程崩溃时,自动重启功能可以帮助快速恢复服务。 实现进程崩溃自动重启的方法多种多样,以下是一些常见的策略: 1. **操作系统的内置功能**:某些操作...
C#作为.NET框架下的主要编程语言,提供了丰富的工具和类库来实现进程监控。本文将深入探讨如何使用C#来监控进程状态,包括监测程序是否崩溃和发生死锁,并讨论如何通过托盘图标进行无声的后台监控。 一、C#进程监控...
1. 进程监测:Process Explorer可以实时监视Windows系统和应用程序的运行情况,显示当前系统中的进程和线程列表,包括进程的名称、PID、内存占用、 CPU 使用率等信息。 2. 安全检查:Process Explorer提供了安全检查...
标题中的“java开发的一...总的来说,这个Java开发的Windows远程监控软件结合了Java编程语言的跨平台优势,实现了对Windows系统的远程监控功能,涵盖了多种监控及管理操作,并且在开发过程中可能运用了多种技术和工具。
本篇文章将深入探讨基于Java的Windows进程监控软件的实现原理、核心功能以及实际应用。 1. **Java与Windows进程监控** Java的可移植性使得开发者可以利用相同的代码在不同的操作系统上进行进程监控。在Windows平台...
Windows系统日志是Windows操作系统内置的一种日志记录工具,用于记录系统运行过程中的各种事件。通过这些日志,管理员能够更好地了解系统的运行状态、用户的活动情况以及可能存在的安全事件等关键信息,从而有效预防...
标题和描述中提到的"可以监视内存的进程,如果消失不存在,则可以重新启动该应用程序",这是一种典型的进程监控与自动恢复机制,常见于服务器管理和分布式系统中。 进程监视器(Process Monitor)是一种工具,它...
在Windows操作系统中,抓包程序是一种用于监测网络通信并记录数据包的工具。这些工具能够帮助网络管理员、开发者和安全专家分析网络流量,排查问题,或者进行网络安全审计。本篇文章将详细探讨如何利用MFC...
通过本次实验,旨在加强学生对进程这一基本概念的理解,掌握进程与程序之间的区别,理解并发执行的本质,并通过具体操作熟悉Windows操作系统下的进程管理功能。 #### 实验目的 1. **深化进程概念的理解**:通过...
在IT领域,守护进程和服务程序是操作系统中不可或缺的部分,它们常在后台运行,确保关键任务的稳定执行。本文将深入探讨如何利用Delphi编程语言来创建一个守护进程,该进程能够监控并自动重启指定的应用程序。 ...
总结来说,"windows下的监控程序"即AppWatcher是一个用于Windows平台的守护进程工具,其核心功能是监测指定的.exe程序,确保其稳定运行,一旦出现异常则自动重启,并记录详细的运行状态,为系统的可靠性和维护提供...