check_mem.pl - Plugin Nagios para checar consumo de RAM
Publicado por Sandro Marcell 26/12/2008
[ Hits: 13.079 ]
Homepage: http://sanmarcell.wordpress.com
Simples plugin para o Nagios, que monitora o consumo REAL de memória RAM e apresenta os dados em forma de porcentagem. Pode ser usado tanto em servidores locais como em hosts remotos, via nrpe.
Exemplo de uso:
check_mem.pl -w 60% - c 90%
ou
check_mem.pl --warning=60% --critical=90%
Mais detalhes:
check_mem.pl -a
Falou!!!
#!/usr/bin/perl -w
#
# check_mem.pl v0.1
#
# Plugin Nagios para checagem de porcentagem de uso REAL da memoria RAM
# pelo sistema (Versao Perl).
#
# Sandro Marcell (sandro_marcell@yahoo.com.br)
# Boa Vista, Roraima - 18/12/2008
#
# Obs.:
# - Licenca: "GNU Public License v2"
# - Plugin testado no Nagios, compilado com suporte a 'ePN'
# (Embedded Perl Nagios)
# - Testado somente em sistemas Linux
# - Plugin passivel de melhorias ;)
use strict;
use Getopt::Long qw(:config no_ignore_case);
# 'Embedded Perl Nagios':
use lib "/usr/local/nagios/libexec";
use utils qw(%ERRORS $TIMEOUT);
# Inicializando variaveis:
my $warning = "";
my $critical = "";
my %opc = ();
my (
$ramtotal ,
$ramlivre ,
$rambuffer,
$ramcache ,
$ramusada ,
$putil ,
);
# Sinal 'timeout' recebido, finaliza o plugin com status unknown:
$SIG{'ALRM'} = sub {
print("ERRO: Nagios time-out\n");
exit($ERRORS{'UNKNOWN'});
};
# Como utilizar o plugin:
sub __uso__ {
print <<FIM;
check_mem.pl v0.1 (Nagios plugin)
Plugin para checagem de porcentagem de uso REAL da memoria RAM pelo sistema
Uso: check_mem.pl -aV [-w VALOR%] [-c VALOR%]
Opcoes:
-a, --ajuda
Mostra esta tela de ajuda
-V, --versao
Mostra a versao do plugin
-w VALOR%, --warning=VALOR%
Finaliza o plugin com status 'warning', quando VALOR% for superado
-c VALOR%, --critical=VALOR%
Finaliza o plugin com status 'critical', quando VALOR% for superado
FIM
exit($ERRORS{'UNKNOWN'});
}
sub __ajuda__ {
print("Faca 'check_mem.pl -a' para mais detalhes\n");
exit($ERRORS{'UNKNOWN'});
}
# Subrotina responsavel pela checagem do status de uso da memoria:
sub __memstatus__ {
unless (open(ARQUIVO , "< /proc/meminfo")) {
print("ERRO: '/proc/meminfo' $!\n");
exit($ERRORS{'CRITICAL'});
}
# Capturando linhas especificas do arquivo:
foreach (<ARQUIVO>) {
$ramtotal = "$_" if (/MemTotal:/);
$ramlivre = "$_" if (/MemFree:/);
$rambuffer = "$_" if (/Buffers:/);
$ramcache = "$_" if (/^Cached:/);
}
close(ARQUIVO);
for my $i ($ramtotal , $ramlivre , $rambuffer , $ramcache) { $i =~ s/[^0-9]//g; }
# Quantidade real de RAM em uso:
$ramusada = $ramtotal - ($ramlivre + $rambuffer + $ramcache);
# Porcentagem utilizada:
$putil = $ramusada * 100 / $ramtotal;
}
# Parametros que podem ser definidos pelo usuario:
GetOptions(\%opc,
"a|ajuda",
"V|versao",
"w|warning=s",
"c|critical=s",
) or __ajuda__;
__uso__ if (defined($opc{'a'}));
if (defined($opc{'V'})) {
print("check_mem.pl v0.1 (18/12/2008)\n");
exit($ERRORS{'OK'});
}
# Valor 'warning':
if (defined($opc{'w'})) {
$warning = $opc{'w'};
# Somente valores entre [1-100] seguidos de '%' sao validos:
unless ($warning =~ /^([1-9][0-9]?|1[0]{0,2})\%{1}$/) {
print("ERRO: Valor invalido para a opcao 'w'\n");
__ajuda__;
}
# Se '$warning' estiver dentro do padrao, remove-se o '%'
$warning =~ s/\%//;
}
# Valor 'critical':
if (defined($opc{'c'})) {
$critical = $opc{'c'};
unless ($critical =~ /^([1-9][0-9]?|1[0]{0,2})\%{1}$/) {
print("ERRO: Valor invalido para a opcao 'c'\n");
__ajuda__;
}
$critical =~ s/\%//;
}
# Opcoes obrigatorias [-w] e [-c]:
if ($warning eq "" or $critical eq "") {
print("check_mem.pl: Argumentos insuficientes\n");
__ajuda__;
}
__memstatus__;
$putil = sprintf("%3d" , $putil);
$ramtotal = sprintf("%3d" , $ramtotal / 1024);
$ramlivre = sprintf("%3d" , ($ramlivre + $rambuffer + $ramcache) / 1024);
# Testes condicionais:
if ($putil > $warning) {
print("RAM WARNING - ${putil}% em uso (Disponivel: ${ramlivre}MB de ${ramtotal}MB)\n");
# Retorna o codigo de saida para o Nagios:
exit($ERRORS{'WARNING'});
} elsif ($putil > $critical) {
print("RAM CRITICAL - ${putil}% em uso (Disponivel: ${ramlivre}MB de ${ramtotal}MB)\n");
exit($ERRORS{'CRITICAL'});
} else {
print("RAM OK - ${putil}% em uso (Disponivel: ${ramlivre}MB de ${ramtotal}MB)\n");
exit($ERRORS{'OK'});
}
# Fim
Renomeando arquivos de forma padronizada
Crivo de Eratóstenes Simples em Perl
Inserindo o nome de aluno e calculando média de suas notas
Cadastro usando arquivos .txt para guardar dados
Lendo o conteúdo de uma página da Internet
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Novos apps de produtividade, avanços em IA e distros em ebulição agitam o universo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
O programa assinador digital (0)
dpkg: erro: gatilho de arquivo duplicado chamado pelo arquivo de nome (6)
Instalação não está resolvendo as dependencias (2)
Captação de áudio no zorin linux começa a diminuir com o tempo (5)









