简单进程监控

来源:互联网 发布:远程访问access数据库 编辑:程序博客网 时间:2024/06/06 23:50

以前做过ATM机项目,除了最基本的逻辑功能,比如取款,查询!转账等,虽然这些很重要,但是有更重要的一个事情,那就是监控,对ATM运行程序的监控,对于ATM状态的监控,

以及对于ATM硬件的监控。这些都是实时的,需要把这些信息发回给银行服务器系统,这样银行才好进行维护。银行服务器这段会根据状态把故障级别进行设置,例如错误就报红色,

警告就报黄色,正常就白色。那么银行服务器怎么收到这个状态的呢,外国银行有个ATM协议,用来规则包的数据字段的类型,用处,以及取值,每个ATM机器部件都有自己

的协议包规则,客户端只要获取到硬件的状态或者程序的运行状态,然后按照协议规定,把相应的值进行填充,发送给服务器端,服务器端就会去解析,然后进行报警预告。

现在就简单实现一下监控程序的运行状态,整个流程是这样的,获取程序的运行状态,例如程序是否异常停止。获取程序日志信息,然后把该信息写入数据库,然后与服务器交互的程序去解析日志,把相应的值发给另外一端的警告服务器,服务器收到后进行预警。

现在就简单实现获取要监控的所有程序的进程信息,看进程是否存在

int FindProStat(const char *szProPath)
{
 FILE *pf =NULL;
 char szProExe[50] = { 0 };
 char szTmpProPath[BUF500] = { 0 };
 char cmd[50]={0};
 int ireturn = -1;

 strcpy(cmd, "find /proc -maxdepth 3 -type l -name \"exe\" 2>/dev/null >proexe.txt");

 if(system(cmd)<0)
 {
    return (-1);
 }

 if (NULL == (pf = fopen("proexe.txt", "r")))
 {
     return (-1);
 }

 while (NULL != fgets(szProExe, sizeof(szProExe) / sizeof(szProExe[0]), pf))
 {
  szProExe[strlen(szProExe)-1]=0;
  memset(szTmpProPath,0,sizeof(szTmpProPath));
  int rslt = readlink(szProExe, szTmpProPath, sizeof(szTmpProPath) - 1); //获取进程的路径
  if (rslt < 0 || (rslt >= (sizeof(szProPath) - 1)))
  {
   continue;
  }
  ireturn = strcmp(szTmpProPath, szProPath);//与入参进行比较
  if (0 == ireturn)
  {
   fclose(pf);
   return 0;
  }
 }
 fclose(pf);
 return 1;
}