/* =============================================================================================== * * Filename: monitor.cpp * * Description: Monitor the operating status of the system and publish it. * * Version: 0.1 * Created: 2020年07月15日 10时21分 * Revision: none * Compiler: gcc/g++ * Link: -lpthread * * Author: songtianlun, songtianlun@comleader.com.cn * Organization: IEUCD * * ===============================================================================================*/ #include "monitor.h" int main (void) { int key_process_ret, key_sys_value_ret, key_files_ret, key_log_ret; pthread_t key_process_pth, key_sys_value_pth, key_files_pth, key_log_pth; //线程ID变量 init_config("Config.ini"); // 参数:创建的线程ID,线程参数,调用函数,函数参数 key_process_ret = pthread_create(&key_process_pth,NULL,monitor_key_process,NULL); key_sys_value_ret = pthread_create(&key_sys_value_pth,NULL,monitor_key_sys_value,NULL); key_files_ret = pthread_create(&key_files_pth,NULL,monitor_key_files,NULL); key_log_ret = pthread_create(&key_log_pth,NULL,monitor_key_log,NULL); pthread_join(key_process_pth, NULL); // 等待线程结束 pthread_join(key_sys_value_pth, NULL); pthread_join(key_files_pth, NULL); pthread_join(key_log_pth, NULL); return 0; } void *monitor_key_process(void *args) { printf("Start the new thread to monitor key process.\n"); } void *monitor_key_sys_value(void *args) { Cpu_info ocpu,ncpu; Mem_info omem; User_info users[50]; Group_info groups[50]; char crontabs[100][200]; float cpu_occupy = 0; float mem_occupy = 0; int sum_tcp_socket = 0; int sum_progress = 0; int sum_user = 0; int sum_group = 0; int sum_crontab = 0; memset(&users,0,sizeof(users)); printf("Start the new thread to monitor key system values.\n"); while(1) { // printf("-------------------- CPU occupy -------------------\n"); get_cpu_occupy(&ocpu); sleep(1); get_cpu_occupy(&ncpu); cpu_occupy = cal_cpu_occupy(&ocpu, &ncpu); // printf("-------------------- Mem occupy -------------------\n"); get_mem_occupy(&omem); mem_occupy = cal_mem_occupy(&omem); sum_tcp_socket = get_tcp_socket_sum(); sum_progress = get_progress_sum(); sum_user = get_users(users); sum_group = get_groups(groups); sum_crontab = get_crontab(crontabs); // system("clear"); printf("-------------------- Monitor Info -------------------\n"); print_now_time(); printf("CPU Usage(%) : %4.2f\n", cpu_occupy); printf("Mem Usage(%) : %4.2f\n", mem_occupy); printf("Tcp Socket Establish : %d\n", sum_tcp_socket); printf("Sum of progress : %d\n", sum_progress); printf("Sum of Users : %d\n", sum_user); printf("Sum of Groups : %d\n", sum_group); printf("Sum of Crontabs : %d\n", sum_crontab); printf("--------------------- User List --------------------\n"); for(int i=0;iname, &o->user, &o->nice, &o->system, &o->idle, &o->iowait, &o->irq, &o->softirq, &o->stealstolen, &o->guest, &o->guest_nice); // printf("name=%s, user=%d, nice=%d, system=%d, idle=%d, iowait=%d, irq=%d, softirq=%d, stralstolen=%d, guest=%d, guest_nice=%d\n", o->name, o->user, o->nice, o->system, o->idle, o->iowait, o->irq, o->softirq, o->stealstolen, o->guest, o->guest_nice); fclose(fd); } float cal_cpu_occupy (Cpu_info *o, Cpu_info *n) { int ototal, ntotal; int oused, nused; ototal = (o->user + o->nice + o->system + o->idle + o->iowait + o-> irq + o-> softirq + o->stealstolen + o->guest + o->guest_nice); ntotal = (n->user + n->nice + n->system + n->idle + n->iowait + n-> irq + n-> softirq + n->stealstolen + n->guest + n->guest_nice); oused = ototal - o->idle; nused = ntotal - n->idle; // printf("ototal time: %d\n", ototal); // printf("ntotal time: %d\n", ntotal); // printf("oused time: %d\n", oused); // printf("nused time: %d\n", nused); return (100.0 * (nused - oused) / (ntotal - ototal)); } void get_mem_occupy (Mem_info *o) { FILE* fpMemInfo = fopen("/proc/meminfo", "r"); if (NULL == fpMemInfo) { return ; } int i = 0; int value; char name[1024]; char line[1024]; int nFiledNumber = 2; int nMemberNumber = 5; while (fgets(line, sizeof(line) - 1, fpMemInfo)) { if (sscanf(line, "%s%u", name, &value) != nFiledNumber) { continue; } if (0 == strcmp(name, "MemTotal:")) { ++i; o->total = value; } else if (0 == strcmp(name, "MemFree:")) { ++i; o->free = value; } else if (0 == strcmp(name, "MemAvailable:")) { ++i; o->available = value; } else if (0 == strcmp(name, "Buffers:")) { ++i; o->buffers = value; } else if (0 == strcmp(name, "Cached:")) { ++i; o->cached = value; } if (i == nMemberNumber) { break; } } // system("free"); // system("cat /proc/meminfo"); // printf("MemTotal : %d\n",o->total); // printf("MemFree : %d\n",o->free); // printf("MemAvailable : %d\n",o->available); // printf("MemBuffers : %d\n",o->buffers); // printf("MemCached : %d\n",o->cached); // printf("MemSwapCached : %d\n",o->swap_cached); // printf("MemSwapTotal : %d\n",o->swap_total); // printf("MemSwapFree : %d\n",o->swap_free); fclose(fpMemInfo); } float cal_mem_occupy(Mem_info *o) { return (100.0 * (o->total - o->available) / o->total); } int get_tcp_socket_sum () { int socket_num=0; FILE *tcp; char tmp[1024]; //设置一个合适的长度,以存储每一行输出 int value; char name[1024]; tcp = popen("netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'", "r"); if (tcp == NULL) { return 0; } while (fgets(tmp, sizeof(tmp) - 1, tcp)) { if (sscanf(tmp, "%s %u", name, &value) != 2) { continue; } if (0 == strcmp(name, "ESTABLISHED")) { socket_num = value; break; } } pclose(tcp); return socket_num; } int get_progress_sum () { int progress_num=0; FILE *progress; char tmp[1024]; progress = popen("ps -ef| wc -l", "r"); if (progress == NULL) { return 0; } fgets(tmp, sizeof(tmp) - 1, progress); sscanf(tmp, "%u", &progress_num); pclose(progress); return progress_num; } int get_users (User_info users[]) { char line[10240]; char *name = NULL; char *passwd = NULL; char *cid; char *cgroup_id; int i=0; FILE* fpUserInfo = fopen("/etc/passwd", "r"); if (NULL == fpUserInfo) { return -1; } while (fgets(line, sizeof(line) - 1, fpUserInfo)) { // printf("%s",line); name = strtok(line, ":"); passwd = strtok(NULL, ":"); cid = strtok(NULL, ":"); cgroup_id = strtok(NULL, ":"); strcpy(users[i].name, name); strcpy(users[i].passwd, passwd); strcpy(users[i].cid,cid); strcpy(users[i].cgroup_id,cgroup_id); // printf("user name=%s, user id=%s, user group id=%s\n",users[i].name,users[i].cid,users[i].cgroup_id); i++; } fclose(fpUserInfo); return i; } int get_groups (Group_info groups[]) { char line[10240]; char *name = NULL; char *passwd = NULL; char *gid; int i=0; FILE* fpGroupInfo = fopen("/etc/group", "r"); if (NULL == fpGroupInfo) { return -1; } while (fgets(line, sizeof(line) - 1, fpGroupInfo)) { // printf("%s",line); name = strtok(line, ":"); passwd = strtok(NULL, ":"); gid = strtok(NULL, ":"); strcpy(groups[i].name, name); strcpy(groups[i].passwd, passwd); strcpy(groups[i].gid,gid); // printf("group name=%s, group id=%s\n",groups[i].name,groups[i].gid); i++; } fclose(fpGroupInfo); return i; } int get_crontab(char crontab[][200]) { int sum_crontab=0; FILE *fpCrontab; char tmp[10240]; //设置一个合适的长度,以存储每一行输出 char info[1024]; fpCrontab = popen("cat /etc/passwd | cut -f 1 -d : |xargs -I {} crontab -l -u {}", "r"); if (fpCrontab == NULL) { return -1; } while (fgets(tmp, sizeof(tmp) - 1, fpCrontab)) { sscanf(tmp, "%[^ ]", info); if(!strcmp(info,"no")) continue; strcpy(crontab[sum_crontab++],tmp); } pclose(fpCrontab); return sum_crontab; } /* * === FUNCTION ====================================================================== * Name: print_now_time * Description: 获取并格式化打印当前时间。 * ===================================================================================== */ void print_now_time() { time_t rawtime; struct tm * timeinfo; char buffer [128]; time (&rawtime); // printf("%ld\n", rawtime); timeinfo = localtime (&rawtime); strftime (buffer,sizeof(buffer),"Now is %Y/%m/%d %H:%M:%S",timeinfo); printf("%s\n", buffer); } /* * === FUNCTION ====================================================================== * Name: split * Description: 将str字符以spl分割,存于dst中,并返回子字符串数量 * ===================================================================================== */ int split(char dst[][80], char* str, const char* spl) { int n = 0; char *result = NULL; result = strtok(str, spl); while( result != NULL ) { strcpy(dst[n++], result); result = strtok(NULL, spl); } return n; }