C-Programm – check_mem für Nagios

This blog post has been published on 2011-03-03 and may be out of date.

Habe gerade ein kleines C-Programm geschrieben, welches mithilfe von Nagios / Icinga die Speicherauslastung (Arbeitsspeicher + Swap) eines Linux-Servers überprüfen kann. Wenn ein Server seine aktuell laufenden Programm auf der Festplatte auslagern muss, da zu wenig Arbeitsspeicher zur Verfügung steht, sollte man darüber ggf. informiert werden… :-)

/*****************************************************************************
* 
* Nagios check_mem plugin
* 
* License: GPL
* Copyright (c) 2000 Karl DeBisschop (kdebisschop@users.sourceforge.net)
* Copyright (c) 2000-2007 Nagios Plugins Development Team
* Copyright (c) 2011 Lars Moelleken (voku@voku-online.de)
* 
* Description:
* 
* This file contains the check_mem plugin
* 
* 
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* 
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
* 
* You should have received a copy of the GNU General Public License
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
* 
* 
*****************************************************************************/

const char *progname = "check_mem";
const char *NP_VERSION = "0.1";
const char *copyright = "2011";
const char *email = "voku@voku-online.de";

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/sysinfo.h>

void print_usage (void);
void print_help (void);


int main (int argc, char *argv[]) {
    long total = 0, free_total = 0, used_total = 0;
    long total_mem = 0, free_mem = 0, used_mem = 0;
    long total_swap = 0, free_swap = 0, used_swap = 0;
    struct sysinfo meminfo;

    char *warn_percent = NULL;
    char *crit_percent = NULL;

    int STATE_OK = 0;
    int STATE_WARNING = 1;
    int STATE_CRITICAL = 2;
    int STATE_UNKNOWN = 3;
    int result = 0;

     if (argc < 2) {
        print_help();
        printf("Hilfe anzeigen lassen: %s -h\n", argv[0]);
        exit(STATE_UNKNOWN);
    }

    char option;
    while((option = getopt(argc, argv, "hwc:")) != EOF) {
        switch(option) {
            case 'h':
                print_help();
                break;
            case 'w':
                warn_percent = argv[2];
                break;
            case 'c':
                crit_percent = argv[4];
                break;
            case ':':
                printf("option needs a value\n");
                break;
            case '?':
                printf("unknown option: %c\n", optopt);
                break;
        }
    }

    if(sysinfo(&meminfo) !=0) {
        perror("Fehler ...");
    }

    total_mem = meminfo.totalram;
    free_mem = meminfo.freeram;
    used_mem = meminfo.totalram - meminfo.freeram;

    total_swap = meminfo.totalswap;
    free_swap = meminfo.freeswap;
    used_swap = meminfo.totalswap - meminfo.freeswap;

    total = total_mem + total_swap;
    free_total = free_mem + free_swap;
    used_total = used_mem + used_swap;

    if (free_swap < total_swap/2 || free_total < total / 100 * atoi(crit_percent)) {
        printf("CRITICAL > ");
        result = STATE_CRITICAL;
    } else if (free_total < total / 100 * atoi(warn_percent)) {
        printf("WARNING > ");
        result = STATE_WARNING;
    } else {
        result = STATE_OK;
        printf("OK > ");
    }
    printf("Free Mem+Swap: %ld - Free Mem: %ld - Free Swap: %ld", free_total/1024/1024, free_mem/1024/1024, free_swap/1024/1024); // test-Ausgabe
    return result;
}


void print_help (void) {
    printf ("%s\n", "Check memory on local machine.");

  printf ("\n");

    print_usage ();

  printf (" %s\n", "-w PERCENT%%");
  printf ("    %s\n", "Exit with WARNING status if less than PERCENT of mem/swap space is free");
  printf (" %s\n", "-c PERCENT%%");
  printf ("    %s\n", "Exit with CRITCAL status if less than PERCENT of mem/swap space is free");
    printf ("\n");
}


void print_usage (void) {
  printf ("%s -w <percent_free>%% -c <percent_free>%%\n",progname);
}

Published by

voku

Lars Moelleken | Ich bin root, ich darf das!

%d bloggers like this: