Script bash para estadísticas de Apache

Hacker

Aquí dejo otro interesante script Bash para ver estadísticas de consumo de RAM (cantidad de memoria ocupada, memoria disponible, etc) y conexiones de nuestro servidor Apache. Leído en http://blog.desdelinux.net/script-bash-para-ver-estadisticas-de-consumo…, comparto por que era exactamente lo que necesitaba para mi servidor.

script bash linux apache estadisticas


#!/bin/bash

# Definimos la función
function doStat()
{
# Define variables
# Iniciación de variables que vamos a usar
cnt=0
cpl=0
di1=1
di2=$((1024*1000))
di3=1024
max=0
statusbar=38
tot=0
ty1="Mb"
ty2="Mb"
ty3="Mb"
ty4="Mb"
ty5="Mb"

# Compruebo si estamos en un servidor con cPanel instalado, ya hay ligeras variaciones en el formato de "TOP"
# Aquí vemos una sentencia condicional, siempre empieza por if, hay que observar que despúes del corchete "[" siempre hay que dejar un espacio. Igualmente, hay que dejar un espacio antes del corchete de cierre.
if [ -d /usr/local/cpanel ]; then
cpl=1
di1=100
fi
# Cerramos la sentencia con "fi"
# Comprobar si la memoria encontrada en top contiene el caracter "m" para saber que si los resultados se presentan en Mb o Kb
mck=`top -b -c -n 1|grep -E "apache|httpd"|awk '{print$6}'|grep -c m`
if [ $mck -ne 0 ]; then
di1=1
fi
# Cargamos en la variable fre la memoria disponible
fre=`grep -E "^MemFree:" /proc/meminfo|awk '{print$2}'`
# Cargamos en la variable total la memoria instalada
total=`grep -E "^MemTotal:" /proc/meminfo|awk '{print$2}'`

# Cargamos en mem la memoria usada por Apache. La sacamos de la función top.
mem=`top -b -c -n 1|grep -E "apache|httpd"|grep -v grep | awk '{print$6}'|sed -e 's/[a-zA-Z]//g'`

# Bucle para mirar cada proceso y calcular ( por proceso )
# avg - media
# max - máxima memoria usada
# tot - total de memoria usada

for m2 in $mem
do
# Comprobamos si la memoria es un valor entero o un valor real. Aquí usamos una expresión regular en la condicional.
if [[ $m2 =~ ^[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
#IFS es el valor interno de Bash para el separador de variables internas
OIFS=IFS
IFS='.'
m2=($m2)
IFS=$OIFS
# La parte real del número la guardo en m1
m1=${m2[1]}
# La parte entera la guardo en m2
m2=${m2[0]}
# Miramos el número de caracteres que hay en la parte real. Para hacer las conversiones
m3=${#m1}
m4=10
if [ $m3 -eq 2 ]; then m4=100; fi
if [ $m3 -eq 3 ]; then m4=1000; fi
# Convertimos a decimal
m3=$(((m1*1024)/m4))
# Calculamos tamaño del decimal
m2=$(((m2*1024)+m3))
fi
# Fin de la comprobación de números reales
m=$((m2/di1))
# Cargamos en max el proceso que más memoria ocupa
if [ $m -gt $max ]; then
max=$m
fi
# Incrementamos contador y total
cnt=$((cnt+1))
tot=$((tot+m))
avg=$((tot/cnt))
done
# Fin del bucle
mxu=$((tot*1024))

# Comprobamos la media y evitamos la división por cero
if [ $avg -eq 0 ]; then
avg=1
fi

# Obtenemos el número total de los procesos de apache
# escuchando o conectado
cnt=`lsof -i :80|grep -iE "esta|ist|esc"|wc -l`

# Calculamos los procesos disponibles de la máquina
ava=$(((fre/avg)/100))
wst=$(((fre/max)/100))
# Aquí usamos BC. Necesitamos un número real y bash no permite operaciones con estos de forma interna
pct=`echo "scale=2;($fre/$total)*100"|bc`
out=`echo "scale=2;($pct/100)*$statusbar"|bc|awk -F\. '{print$1}'`

# Ajustamos para cPanel si es necesario
if [ $cpl ] && [ "$out" == '' ]; then
out=0
fi

# Calculamos el uso de la memoria y convertimos a Gb si es necesario
if [ $fre -ge $di2 ]; then
ty1="Gb"
fre=`echo "scale=2;$fre/$di2"|bc`
else
if [ $fre -ge $di3 ]; then
fre=`echo "scale=2;$fre/$di3"|bc`
fi
fi
if [ $mxu -ge $di2 ]; then
ty2="Gb"
mxu=`echo "scale=2;$mxu/$di2"|bc`
else
if [ $mxu -ge $di3 ]; then
mxu=`echo "scale=2;$mxu/$di3"|bc`
fi
fi
if [ $total -ge $di2 ]; then
ty3="Gb"
total=`echo "scale=2;$total/$di2"|bc`
fi
if [ $avg -ge $di2 ]; then
ty4="Gb"
avg=`echo "scale=2;$avg/$di2"|bc`
fi
if [ $max -ge $di2 ]; then
ty5="Gb"
max=`echo "scale=2;$max/$di2"|bc`
fi

# Bucle para mostrar una barra de estado
sloop=$statusbar
statusbar=$((statusbar+3))
nline=`seq -s "=" $statusbar|sed 's/[0-9]//g'`

# Mostramos resultados
printf "%s\n" $nline
printf "Apache processes and memory usage.\n"
printf "%s\n" $nline
printf "Total installed memory: %s%s\n" $total $ty3
printf "Availiable memory: %s%s\n" $fre $ty1
printf "Free percentile: %s\45\n" $pct

# Mostramos la memoria usada en la barra de estado. Observamos que en el bucle while, los corchetes llevan sus espacios después y antes, como en el if que hemos descrito antes.
printf "Status bar:\n|"
while [ $sloop -ge 1 ]; do
cc="-"
if [ $sloop -ge $out ]; then
cc="+"
fi
printf "%s" $cc
sloop=$((sloop-1))
done
printf "|\n"

printf "%s\n" $nline
printf "Current usage\n"
printf "%s\n" $nline
printf "Current processes: %d\n" $cnt
printf "Average memory:\t %s%s\n" $avg $ty4
printf "Maximum memory:\t %s%s\n" $max $ty5
printf "Overall memory:\t %s%s\n" $mxu $ty2
printf "%s\n" $nline
printf "Projected usage\n"
printf "%s\n" $nline
printf "Concurrent best: %d more connection(s)\n" $ava
printf "Concurrent worst: %d more connection(s)\n" $wst
printf "%s\n" $nline
}
# Fin de la función
# Ejecutamos la función
doStat

Doncs bé això és tot, espere que trobes útil aquest article i que et motive a compartir els teus trucs, els teus coneixements i els teus experiments amb el Programari Lliure. Pensa-ho, va, que la Comunitat del Programari Lliure va creixent gràcies a la documentació, el disseny, la formació o la programació, sigues part de la Comunitat :-)

La cultura i la lliure circulació de les idees és l'arma més efectiva contra les dictadures del pensament i contra la ignorància.