Script - monitorando servidor

Publicado por Leandro da S. Barbosa 26/03/2005

[ Hits: 13.928 ]

Download monitoramento.sh




O script a seguir monitora os processos bem como a utilização de memória de cada processo, a utilização de CPU, espaço livre em partições do sistema, espaço livre em memória e swap.
Script é similar ao perfmon do Windows Advanced Server porém os alertas são só enviados por e-mail do administrador. É customizável poderá ajustar as configurações de alertas.

  



Esconder código-fonte

#!/bin/bash
#
############################################################################
# Script produzido por Leandro da S. Barbosa ( 26/11/2004 1:44pm )         #
############################################################################
#                                                                          #
# Monitoramento de processos, memória e disco.                             #
#                                                                          #
############################################################################
# v1.5 (Updated)
#


############### CONFIGURAÇÃO DA VARIÁVEL DE AMBIENTE #######################

# Quantidade máxima de CPU utilizada em % ( entre 1 a 9 )
CPU_MAX_SYSTEM=8

# Quantidade mínima de memória livre em % (entre 1 a 99 )
MEM_MIN_SYSTEM=5

# Quantidade mínima de espaço em disco livre em % (entre 1 a 99)
DISK_MIN_SYSTEM=10

# Quantidade mínima livre de swap em % (entre 1 a 99)
SWAP_MIN_SYSTEM=5

# Processamento Máximo por Usuário em % (entre 1 a 9)
PROC_MAX_USER=3

# Uso máximo da memória por Usuário em % (entre 1 a 9)
MEM_MAX_USER=3

# Email para o envio de status do monitoramento
EMAIL=lbarbosa@dba.com.br,aamaro@dba.com.br,gconverso@dba.com.br

# Pasta Temporário de Logs
PASTALOG=/backup/monitor
#################### CÓDIGO FONTE ###### FAVOR NÃO MEXER #####################

if [ ! -d $PASTALOG ]; then
        mkdir -p $PASTALOG
fi
LOGFILE="$PASTALOG/log-monitor-$(/bin/date +%d-%m-%Y-%H-%M-%S).log"
touch $LOGFILE

echo "------------------------------------------------------------------------------------------------ " >> $LOGFILE
echo "- Informações do Servidor                                                                        " >> $LOGFILE
echo "------------------------------------------------------------------------------------------------ " >> $LOGFILE
echo "Kernel: `uname -a` " >> $LOGFILE
echo "Distro: `cat /etc/redhat-release` " >> $LOGFILE
echo "Hostname: `hostname` " >> $LOGFILE
echo " " >> $LOGFILE
echo "------------------------------------------------------------------------------------------------ " >> $LOGFILE
echo "- Detalhes do Status                                                                             " >> $LOGFILE
echo "------------------------------------------------------------------------------------------------ " >> $LOGFILE
echo " " >> $LOGFILE

monitor_detalhado()
{
        a=`ps -aux |awk '{print $2}'`
        b=`ps -aux |awk '{print $3}' |cut -d "." -f1`
        c=`ps -aux |awk '{print $4}' |cut -d "." -f1`
        d=`ps -aux |awk '{print $1}'`
        contador=0
        for x in $b; do
                if [ $x != "%CPU" ]; then
                        vetb[$contador]=$x
                        contador=$(expr $contador + 1)
                fi
        done
        contador=0
        for x in $c; do
                if [ $x != "%MEM" ]; then
                        vetc[$contador]=$x
                        contador=$(expr $contador + 1)
                fi
        done
        contador=0
        for x in $d; do
                if [ $x != "USER" ]; then
                        vetd[$contador]=$x
    contador=$(expr $contador + 1)
                fi
        done
        contador=0
        for PID in $a ; do
                if [ $PID != "PID" ]; then
                        if ([ ${vetb[$contador]} -ge $PROC_MAX_USER ] || [ ${vetc[$contador]} -ge $MEM_MAX_USER ]) ; then
                                echo "($(/bin/date +%d/%m/%Y-%H:%M:%S)) Alerta - Processo $PID do usuário ${vetd[$contador]} ocupando ${vetb[$contador]} de cpu e ${vetc[$contador]} de memória" >> $LOGFILE
                        fi
                        contador=$(expr $contador + 1)
                fi
        done
}

MEM=`free -m | grep Mem | awk '{print $4}'`
MEM_TOTAL=`free -m | grep Mem | awk '{print $2}'`
MEM_PERC=$(expr $MEM_TOTAL \* $MEM_MIN_SYSTEM)
MEM_PERC=$(expr $MEM_PERC / 100 )
DISK_MIN_SYSTEM=$(expr 100 - $DISK_MIN_SYSTEM)
DISK_PERC=`df -m | grep -v none | grep -v Use | awk '{print $5}' | cut -d "%" -f1`
DISK_PERC=`df -m | grep -v none | grep -v Use | grep -v cdrom | awk '{print $5}' | cut -d "%" -f1`
DISK_PART=`df -h | grep -v none | grep -v Filesystem | grep -v cdrom | awk '{print $1}'`
echo "MEM_FREE $MEM MB  -  MEM_TOTAL $MEM_TOTAL  -  MEM_PERC $MEM_PERC   -  MEM_MIN_SYSTEM $MEM_MIN_SYSTEM"
contador=0
echo "DISK_MIN_SYSTEM $DISK_MIN_SYSTEM"
for x in $DISK_PART ; do
        vetPart[$contador]=$x
        echo "DISK_PART ${vetPart[$contador]}"
        contador=$(expr $contador + 1)
done
contador=0
achou="false"
memachou="false"
for x in $DISK_PERC ; do
        echo "DISK_PERC $x"
        if [ $x -ge $DISK_MIN_SYSTEM ];  then
                achou="true"
                echo "Alerta ( A quantidade de espaço em disco na partição ${vetPart[$contador]} está abaixo de $DISK_MIN_SYSTEM% )" >> $LOGFILE
        fi
        contador=$(expr $contador + 1)
done
#if [ $MEM_PERC -ge $MEM ] ; then
#       achou="true"
#       memachou="true"
#       echo "if [ $MEM_PERC -ge $MEM ] ; then "
#       echo "Alerta ( A quantidade de memória está abaixo de $MEM_MIN_SYSTEM% ) TOTAL $MEM_TOTAL(MB) LIVRE $MEM(MB) " >> $LOGFILE
#fi

CPUN=`top -n 1 | grep % | grep -v USER | awk '{print $1}'`
CPU=`top -n 1 | grep % | grep -v USER | awk '{print $3}' | cut -d "." -f1`
contador=0
echo "CPU_MAX_SYSTEM $CPU_MAX_SYSTEM"
for x in $CPUN ; do
        if [ $x == 'total' ]; then
                x="cpu"
        fi
        vetCPUN[$contador]=$x
        echo "CPUN ${vetCPUN[$contador]}"
        contador=$(expr $contador + 1)
done

contador=0
for x in $CPU ; do
        echo "CPU $x"
        if [ $x -gt $CPU_MAX_SYSTEM ] ; then
                echo "if [ $x -gt $CPU_MAX_SYSTEM ] ; then "
                echo "Alerta ( A quantidade de processamento da ${vetCPUN[$contador]} está acima de $CPU_MAX_SYSTEM% ) " >> $LOGFILE
        fi
        contador=$(expr $contador + 1)
done

SWAP_LIVRE=`top -n 1 | grep Swap | awk '{print $6}' | cut -d "K" -f1 | cut -d "k" -f1`
SWAP_LIVRE=$(expr $SWAP_LIVRE / 1024)

SWAP_TOTAL=`top -n 1 | grep Swap | awk '{print $2}' | cut -d "K" -f1 | cut -d "k" -f1`
SWAP_TOTAL=$(expr $SWAP_TOTAL / 1024)

SWAP_PERC=$(expr $SWAP_TOTAL \* $SWAP_MIN_SYSTEM)
SWAP_PERC=$(expr $SWAP_PERC / 100 )

echo "SWAP_LIVRE $SWAP_LIVRE  -  SWAP_TOTAL $SWAP_TOTAL  -  SWAP_PERC $SWAP_PERC  -  SWAP_MIN_SYSTEM $SWAP_MIN_SYSTEM"

sleep 2

#if [ $SWAP_PERC -gt $SWAP_LIVRE ] && [ $SWAP_LIVRE != '' ] && [ $SWAP_TOTAL != '' ] ; then
#       echo "if [ $SWAP_PERC -gt $SWAP_LIVRE ] ; then "
#        achou="true"
#        memachou="true"
#        echo "Alerta ( A quantidade de memória SWAP está abaixo de $SWAP_MIN_SYSTEM% ) TOTAL $SWAP_TOTAL (MB) LIVRE $SWAP_LIVRE (MB) " >> $LOGFILE
#fi

if [ $achou == 'true' ] ; then
        echo "envio de email [OK]"
        if [ $memachou != "false" ] ; then
                echo " " >> $LOGFILE
                echo "------------------------------------------------------------------------------------------------ " >> $LOGFILE
                echo "- Maiores detalhes de Processamento e Memória                                                  - " >> $LOGFILE
                echo "------------------------------------------------------------------------------------------------ " >> $LOGFILE
                echo " " >> $LOGFILE
                monitor_detalhado
        fi

        sleep 1
        echo " " >> $LOGFILE
        echo " " >> $LOGFILE
        echo "Script Monitor v1.0 Prod. Leandro da S. Barbosa (lbarbosa@dba.com.br)" >> $LOGFILE
        echo "'A imaginação é o mais importante fruto do conhecimento' Albert Einstein " >> $LOGFILE
        cat $LOGFILE | mail $EMAIL -s "Alerta - Monitoramento da `hostname` ($(/bin/date +%d/%m/%Y-%H:%M:%S))"
        sleep 1
        rm -f $LOGFILE

fi

Scripts recomendados

Failover WAN entre dois links

Verificar atividade de serviços no Tomcat

Veja os 10 últimos tópicos das comunidades

Utilitário para Slackware 10

Script para limpar os caches do proxy (squid)


  

Comentários
[1] Comentário enviado por meetgyn em 14/11/2014 - 11:38h

Esta com erro na linha 118
./monitor.sh: line 118: [: /: esperado expressão de número inteiro
Mas gostei do seu script.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts