GNU/Linux >> Tutoriels Linux >  >> Linux

Script Shell pour envoyer un e-mail d'alerte si l'utilisation du disque dépasse 90 % ?

Je souhaite implémenter un script sur mon serveur qui enverra automatiquement des alertes par e-mail si l'utilisation du disque dépasse 90% et une deuxième alerte par e-mail lorsqu'elle dépasse 95%. Mon système de fichiers est abc:/xyz/abc et le point de montage est /pqr .

J'ai essayé ceci :

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

Mais je reçois une erreur qui dit

line 7: [: Use: integer expression expected 

Réponse acceptée :

L'erreur est due à l'un des arguments de -ge n'étant pas numérique. Depuis $ALERT est toujours numérique, $usep doit être le coupable. Il y a plusieurs problèmes avec la façon dont vous analysez la sortie de dh qui se traduisent par $usep n'étant pas numérique.

Selon les longueurs des systèmes de fichiers, dh peut diviser sa sortie sur plusieurs lignes. Les lignes partielles seront capturées dans votre filtre et donneront des données absurdes. Pour éviter ce comportement et obtenir une sortie analysable de dh , passez le -P option.

Aussi df imprime une ligne d'en-tête qui se traduira à nouveau par des données absurdes.

Votre filtre est assez complexe. J'utiliserais un seul passage de awk. D'ailleurs, vous pouvez faire le filtrage sur le pourcentage dans awk (mais je ne l'ai pas fait dans le script suivant).

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 correspond à la première ligne, donc NR==1 {next} saute la première ligne. Les quelques lignes suivantes excluent certains systèmes de fichiers (notez que votre description indique que vous êtes intéressé par abc:/xyz/pqr , mais votre code l'exclut). La dernière ligne awk supprime le % de la colonne de pourcentage avant de l'imprimer.

Il serait plus agréable d'envoyer un seul courrier sur tous les systèmes de fichiers. Cette fois, je fais toutes les analyses 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. Expiration du délai dans un script shell ?

  2. Déterminer le chemin d'accès au script shell sourcé ?

  3. Le script shell se bloque sur la commande de messagerie ?

  4. Script ou programme pour enregistrer l'utilisation du disque ?

  5. Shell Script pour imprimer une pyramide d'étoiles

Comment exécuter une commande dans un script shell ?

Obtenir l'utilisation du processeur dans le script shell ?

Envoi de courrier HTML à l'aide d'un script shell

Envoi d'un mail à partir d'un script shell Linux

Répertoire courant du script shell ?

Qu'est-ce que l'utilisation () dans les scripts shell ?