GNU/Linux >> Tutoriales Linux >  >> Linux

¿Script de shell para enviar un correo de alerta si el uso del disco supera el 90%?

Quiero implementar un script en mi servidor que enviará automáticamente alertas por correo electrónico si el uso del disco supera el 90 % y una segunda alerta por correo electrónico cuando supere el 95 %. Mi sistema de archivos es abc:/xyz/abc y el punto de montaje es /pqr .

He probado esto:

ADMIN="[email protected]" 
ALERT=90 
df -H | grep -vE 'abc:/xyz/pqr | tmpfs |cdrom' | awk '{ print $5 " " $1 }' | while read output; do 
  usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 ) 
  partition=$(echo $output | awk '{ print $2 }' ) 
    if [ $usep -ge $ALERT ]; then 
      mail -s "Alert: Almost out of disk space $usep" $ADMIN 
    fi 
  done

Pero recibo un error que dice

line 7: [: Use: integer expression expected 

Respuesta aceptada:

El error se debe a uno de los argumentos de -ge no siendo numérico. Desde $ALERT siempre es numérico, $usep tiene que ser el culpable. Hay varios problemas con la forma en que analiza la salida de dh que dan como resultado $usep no siendo numérico.

Dependiendo de la longitud de los sistemas de archivos, dh puede dividir su salida en varias líneas. Las líneas parciales quedarán atrapadas en su filtro y darán como resultado datos sin sentido. Para evitar este comportamiento y obtener resultados analizables de dh , pasa el -P opción.

También df imprime una línea de encabezado que nuevamente dará como resultado datos sin sentido.

Su filtro es bastante complejo. Usaría un solo pase de awk. De hecho, podría filtrar el porcentaje dentro de awk (pero no lo he hecho en el siguiente script).

df -H | awk '
    NR == 1 {next}
    $1 == "abc:/xyz/pqr" {next}
    $1 == "tmpfs" {next}
    $1 == "/dev/cdrom" {next}
    1 {sub(/%/,"",$5); print $1, $5}
' | while read filesystem percentage; do
    if [ "$percentage" -ge "$ALERT" ]; then 
      mail -s "Alert: Almost out of disk space ($usep%) on $filesystem" "$ADMIN"
    fi 
  done

NR==1 coincide con la primera línea, entonces NR==1 {next} salta la primera línea. Las siguientes líneas excluyen algunos sistemas de archivos (tenga en cuenta que su descripción dice que está interesado en abc:/xyz/pqr , pero su código lo excluye). La última línea awk elimina el % de la columna de porcentaje antes de imprimirlo.

Sería mejor enviar un solo correo sobre todos los sistemas de archivos. Esta vez estoy haciendo todo el análisis en awk.

message=$(df -h | awk -v ALERT="$ALERT" '
    NR == 1 {next}
    $1 == "abc:/xyz/pqr" {next}
    $1 == "tmpfs" {next}
    $1 == "/dev/cdrom" {next}
    1 {sub(/%/,"",$5)}
    $5 >= ALERT {printf "%s is almost full: %d%%n", $1, $5}
')
if [ -n "$message" ]; then
  echo "$message" | mail -s "Alert: Almost out of disk space" "$ADMIN"
fi 

Linux
  1. Envíe un correo electrónico desde la terminal o secuencia de comandos de Linux usando el comando de correo

  2. ¿Determinar Shell en el script durante el tiempo de ejecución?

  3. ¿Tiempo de espera agotado en un script de Shell?

  4. ¿La secuencia de comandos de Shell se bloquea en el comando de correo?

  5. ¿Procesos en una sesión en un shell interactivo versus en un script?

¿Cómo ejecutar un comando en un script de Shell?

Ejecutar script de shell en paralelo

Uso del disco del monitor Bash

Shell script directorio actual?

Cálculo del porcentaje redondeado en Shell Script sin usar bc

Script de transliteración para shell de linux