Fév 082010
voici un petit bout de code C qui mesure l’activité CPU d’une machine et envoie les statistiques à une machine de monitoring
#include <stdio.h> #include <time.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <string.h> #include <unistd.h> #define BUFSIZE 1024 enum { CURRENT , OLD , DIFF , PERCENT , TABSIZE }; enum { USR, NICE, SYSTEM , IDLE , IOWAIT , IRQ , SOFTIRQ , TOTAL , NBCOLS }; enum { ERROR, OK }; unsigned long long int table[NBCOLS][TABSIZE]; void setcolor(int f, int b) { printf("%c[0;%d;%dm",27,30+f,40+b); } void setfcolor(int f) { printf("%c[%d;%dm", 27, f/8, 30+(f%8) ); } void setbcolor(int b) { printf("%c[%d;%dm", 27, b/8, 40+(b%8) ); } void setdefault(void) { printf("%c[m",27); } char thishostname[BUFSIZE]; int s; struct sockaddr_in srvAddr; struct hostent *h; void recuphostname(void) { FILE * f; f=fopen("/etc/hostname" ,"r"); fgets(thishostname , BUFSIZE-1 , f); if ( thishostname[strlen(thishostname)-1] == '\n') thishostname[strlen(thishostname)-1] ='\0'; fclose(f); } int recup(void) { FILE * f; char cpuline[BUFSIZE]; unsigned int i; f=fopen("/proc/stat" ,"r"); if (!f) return ERROR; fgets(cpuline , BUFSIZE-1 , f); fclose(f); for ( i=0 ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++; sscanf(cpuline+i, "%llu", &( table[USR][CURRENT] ) ); for ( i++ ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++; sscanf(cpuline+i, "%llu", &( table[NICE][CURRENT] ) ); for ( i++ ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++; sscanf(cpuline+i, "%llu", &( table[SYSTEM][CURRENT] ) ); for ( i++ ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++; sscanf(cpuline+i, "%llu", &( table[IDLE][CURRENT] ) ); for ( i++ ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++; sscanf(cpuline+i, "%llu", &( table[IOWAIT][CURRENT] ) ); for ( i++ ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++; sscanf(cpuline+i, "%llu", &( table[IRQ][CURRENT] ) ); for ( i++ ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++; sscanf(cpuline+i, "%llu", &( table[SOFTIRQ][CURRENT] ) ); return OK; } void affiche(void) { printf("USR=%03lu ", table[USR][PERCENT]); printf("NICE=%03lu ", table[NICE][PERCENT]); printf("SYSTEM=%03lu ", table[SYSTEM][PERCENT]); printf("IDLE=%03lu ", table[IDLE][PERCENT]); printf("IOWAIT=%03lu ", table[IOWAIT][PERCENT]); printf("IRQ=%03lu ", table[IRQ][PERCENT]); printf("SOFTIRQ=%03lu\n", table[SOFTIRQ][PERCENT]); } void affiche2(void) { int i; int cpt=0; printf("["); //setfcolor(0); setfcolor(2); for ( i=0 ; i < table[USR][PERCENT] ; i++ ) { putc('U',stdout); cpt++; } setfcolor(1); for ( i=0 ; i < table[SYSTEM][PERCENT] ; i++ ) { putc('S',stdout); cpt++; } setfcolor(4); for ( i=0 ; i < table[IOWAIT][PERCENT] ; i++ ) { putc('W',stdout); cpt++; } setfcolor(6); for ( i=0 ; i < table[IRQ][PERCENT]+table[SOFTIRQ][PERCENT] ; i++ ) { putc('I',stdout); cpt++; } setdefault(); for ( i=cpt ; i < 100 ; i++ ) putc(' ',stdout); printf("] CHARGE CPU : %4lu%% \n", 100 - table[IDLE][PERCENT] ); } void affichenet(void) { char outbuffer[2000]; sprintf(outbuffer , "%s|",thishostname); sprintf(outbuffer+strlen(outbuffer) , "%lu|", table[USR][PERCENT]); sprintf(outbuffer+strlen(outbuffer) , "%lu|", table[NICE][PERCENT]); sprintf(outbuffer+strlen(outbuffer) , "%lu|", table[SYSTEM][PERCENT]); sprintf(outbuffer+strlen(outbuffer) , "%lu|", table[IDLE][PERCENT]); sprintf(outbuffer+strlen(outbuffer) , "%lu|", table[IOWAIT][PERCENT]); sprintf(outbuffer+strlen(outbuffer) , "%lu|", table[IRQ][PERCENT]); sprintf(outbuffer+strlen(outbuffer) , "%lu\n", table[SOFTIRQ][PERCENT]); printf("%s", outbuffer); sendto(s, outbuffer, strlen(outbuffer)+1, 0, (struct sockaddr *) &srvAddr, sizeof(srvAddr)); } void submain(void) { unsigned int i=0; if ( ! recup() ) return; for ( i=USR ; i<TOTAL ; i++) { if (table[i][CURRENT]<table[i][OLD]) return; } table[TOTAL][CURRENT] = 0; for ( i=USR ; i<TOTAL ; i++ ) table[TOTAL][CURRENT] += table[i][CURRENT]; /*genere le total */ for ( i=USR ; i<=TOTAL ; i++) table[i][DIFF] = table[i][CURRENT] - table[i][OLD]; /*genere différences */ if ( table[TOTAL][DIFF] == 0 ) return; for ( i=USR ; i<=TOTAL ; i++) table[i][PERCENT] = ( table[i][DIFF] * 100 ) / table[TOTAL][DIFF]; /*calcul pourcentages */ //affiche2(); affichenet(); for ( i=USR ; i<=TOTAL ; i++ ) table[i][OLD]=table[i][CURRENT]; /*archive les anciennes valeur pour la prochaine mesure */ } int main(void) { unsigned int i=0; unsigned int j=0; struct timespec ts; ts.tv_sec=0; ts.tv_nsec=100000000; for ( i=USR ; i<=TOTAL ; i++) for (j=CURRENT ; j<NBCOLS ; j++ ) table[i][j]=0; recuphostname(); srvAddr.sin_family = AF_INET; srvAddr.sin_port = htons(31857); srvAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); s=socket(AF_INET,SOCK_DGRAM,0); if ( s<0 ) return 1; while (1) { nanosleep(&ts, NULL); submain(); } return 0; }
Sorry, the comment form is closed at this time.