zoukankan      html  css  js  c++  java
  • 系统监控技术 -- 主机监控,信息转发,前台显示

    1. 模块关系图

    2. 定时器模块  ==  模拟定时器 + 基本定时器

    模拟定时器结构

    typedef struct stuSimTimer
    {
        char szName[20];	//定时器时间
        int  nInterval;		//定时间隔,取0时表示取消定时
        time_t nLast;		//上次定时的系统时间
        int  nRemain;		//剩余时间
        int (*pfunc)(char *);	//定时到达 执行代码
    } SIMTIMER;
    typedef SIMTIMER * PSIMTIMER;

    模拟定时器有两种方法 :

    a: 相对时间法

    for (i=0; i<nTopTimer; i++)
        {
            sTimer[i].nRemain--;
            if (sTimer[i].nRemain <= 0)
            {
                sTimer[i].pfunc(sTimer[i].szName);
                sTimer[i].nRemain = sTimer[i].nInterval;
            }
        } 

    b: 绝对时间法

    for (i=0; i<nTopTimer; i++)
            {
                if(time(NULL) - sTimer[i].nLast >= sTimer[i].nInterval)
                {
                    sTimer[i].pfunc(sTimer[i].szName);
                    sTimer[i]. nLast = time(NULL);
                }
            }

    基本定时器也有两种方法:

    a: 循环定时

    while(1)
    {
        sleep(1);
        ........
    }

    b:信号定时

    void timefunc(int sig)
    {
        .....
        signal(SIGALRM, timefunc);
        alarm(n);
    }
    .......

    定时器示例一:循环定时 + 绝对时间 

    #include<time.h>
    #include<iostream>
    using namespace std;
    
    typedef struct stuSimTimer
    {
        char szName[20];
        int  nInterval;
        time_t nLast;
        int  nRemain;
        int (*pfunc)(char *);
    } SIMTIMER;
    typedef SIMTIMER * PSIMTIMER;
    
    int func1(char *p)
    {
        cout << time(NULL) <<"Now Timer is: " << p << endl;
        //PrintLog(stdout, "Now Timer : %s", p);
        return 0;
    }
    
    #define MAXTIMER 20
    SIMTIMER sTimer[MAXTIMER] =
    {
        {"TIMER1", 10, 0, 10, func1},
        {"TIMER2", 4, 0, 4, func1}
    };
    int nTopTimer = 2;
    
    int main()
    {
        int i;
        while(1)
        {
            sleep(1);
    
            for (i=0; i<nTopTimer; i++)
            {
                if(time(NULL) - sTimer[i].nLast >= sTimer[i].nInterval)
                {
                    sTimer[i].pfunc(sTimer[i].szName);
                    sTimer[i]. nLast = time(NULL);
                }
            }
        }
    }

    定时器示例二: 信号定时 + 相对时间

    #include<stdio.h>
    #include<time.h>
    #include<iostream>
    #include<signal.h>
    using namespace std;
    
    typedef struct stuSimTimer
    {
        char szName[20];
        int  nInterval;
        time_t nLast;
        int  nRemain;
        int (*pfunc)(char *);
    } SIMTIMER;
    typedef SIMTIMER * PSIMTIMER;
    
    int func1(char *p)
    {
        //PrintLog(stdout, "Now Timer : %s", p);
        cout << time(NULL) <<"Now Timer is: " << p << endl;
        return 0;
    }
    
    #define MAXTIMER 20
    SIMTIMER sTimer[MAXTIMER] =
    {
        {"TIME1", 10, 0, 10, func1},
        {"TIMER2", 4, 0, 4, func1}
    };
    int nTopTimer = 2;
    
    void timefunc(int sig)
    {
        int i;
    
        for (i=0; i<nTopTimer; i++)
        {
            sTimer[i].nRemain--;
            if (sTimer[i].nRemain <= 0)
            {
                sTimer[i].pfunc(sTimer[i].szName);
                sTimer[i].nRemain = sTimer[i].nInterval;
            }
        }
        signal(SIGALRM, timefunc);
        alarm(1);
    }
    
    int main()
    {
        signal(SIGALRM, timefunc);
        alarm(1);
        cout << "----- Begin -------" << endl;
        //PrintLog(stdout, "---Begin---");
        while(1)
        {
            sleep(100);
        }
    }



     3. 监控代码示例,消息队列,进程监控,文件系统监控。。。

    #include <iostream>
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
    #include <sys/ipc.h>
    #include <sys/types.h>
    #include <sys/msg.h>
    #include <sys/vfs.h>
    using namespace std;
    
    int GetMsg1(char *pHost) //监控有没有0x1234这个消息队列
    {
        char szBuf[256], szFmt[] = "%s|MSG|0x1234|%d|%d|%d|%s
    ";
        struct msqid_ds buf;
        int msgid, unused;
        float rate;
        memset(&buf, 0, sizeof(buf));
    
        if ((msgid = msgget(0x1234, 0666)) == -1 ||
            msgctl(msgid, IPC_STAT, &buf) == -1)
        {
            printf(szFmt, pHost, 0, 0, 1, strerror(errno));
            return 0;
        }
        unused = buf.msg_qbytes - buf.msg_cbytes;
        rate = (unused*1.0) / buf.msg_qbytes;
        memset(szBuf, 0, sizeof(szBuf));
        sprintf(szBuf, "space: %d of %d available (%.2f%%).", unused, buf.msg_qbytes, rate*100);
        if (rate >= 0.9)
        {
            printf(szFmt, pHost, unused , buf.msg_qbytes, 2, szBuf);
        }
        else
        {
            printf(szFmt, pHost, unused , buf.msg_qbytes, 0, szBuf);
        }
    }
    
    int GetProcess1(char *pHost)  //监控有没有monitor_type这个进程
    {
        int all = 0, off;
        char szLine[256], szFmt[] = "%s|PROC|%s|%d|1|%d|%s
    ";
        char *ProcessName = "monitor_type";
        char *ShellName = "ps -ef|grep monitor_type";
        FILE *pfile;
        char szUID[20], szPID[20], szPPID[20], szC[20], szSTIME[20], szTTY[20], szTIME[200], szCMD[255];
        if ((pfile = popen(ShellName, "r")) == NULL)
        {
            printf(szFmt, ProcessName, pHost, 0, 1, "error:shell");
        }
        else
        {
            memset(szLine, 0, sizeof(szLine));
            while (fgets(szLine, sizeof(szLine), pfile) != NULL)
            {
                sscanf(szLine, "%s%s%s%s%s%s%s%s", szUID, szPID, szPPID, szC, szSTIME, szTTY, szTIME,szCMD);
                //cout << "szLine: " << szLine << endl;
                //cout << "szCMD: " << szCMD << endl;
                if (strlen(szCMD) >= strlen(ProcessName))
                {
                    off = strlen(szCMD)-strlen(ProcessName);
                    if (strcmp(szCMD+off, ProcessName) == 0) all++;
                }
            }
            pclose(pfile);
            if (all > 0) printf(szFmt, pHost, ProcessName, all, 0, "OK");
            else printf(szFmt, pHost, ProcessName, all, 1, "No Process");
        }
    }
    
    int GetFilesysValue(char *pHost, char *pPath)  //监控制定目录文件系统的信息
    {
        char szFmt[] = "%s|FILE|%s|%d|%d|%d|%s
    ", szRate1[30], szRate2[30];
        struct statfs buf;
        float rused, rinode;
        int nalarm;
        if (statfs(pPath, &buf) == 0)
        {
            rused = (double)buf.f_bfree / buf.f_blocks;
            rinode = (double)buf.f_ffree / buf.f_files;
            sprintf(szRate1, "block : %.2f%% available", rused*100);
            sprintf(szRate2, "inode : %.2f%% available", rinode*100);
            if (rused >= 0.15) nalarm = 0;
            else if (rused >= 0.5) nalarm = 2;
            else nalarm = 1;
            printf(szFmt, pHost, pPath, buf.f_bfree, buf.f_blocks, nalarm, szRate1);
            if (rinode >= 0.15) nalarm = 0;
            else if (rinode >= 0.5) nalarm = 2;
            else nalarm = 1;
            printf(szFmt, pHost, pPath, buf.f_ffree, buf.f_files, nalarm, szRate2);
        }
        return 0;
    }
    
    int main()
    {    
        cout << "test monitor type ----> msg " << endl;
        int msgid = msgget(0x1234, 0666 | IPC_CREAT);
        msgsnd(msgid, "1", strlen("1"), 0);
        GetMsg1("kevin_pc");
    
        cout << "test monitor type ----> process " << endl;
        GetProcess1("kevin_pc");
    
        cout << "test monitor type ----> filesystem " << endl;
        GetFilesysValue("kevin_pc", "/usr");
        GetFilesysValue("kevin_pc", "/");
    
        return 0;
    }
    
    


     

  • 相关阅读:
    docker进入容器命令
    docker复制文件到容器内以及从容器内复制文件到宿主机
    在idea中创建maven父子工程,子工程无法导入父工程依赖的问题
    maven merge 其他分支比如master的方法
    Maven 右边的maven 项目为空 pom文件
    Spark Streaming集成Kafka调优
    spark sql/hive小文件问题
    CompletableFuture详解
    样式绑定styleBinding
    jsonArray图片数组实例
  • 原文地址:https://www.cnblogs.com/xj626852095/p/3648239.html
Copyright © 2011-2022 走看看