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


11

Je veux 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/abcet le point de montage est /pqr.

J'ai essayé ceci:

ADMIN="someone@def.com" 
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éponses:


13

L'erreur est due à l'un des arguments pour -gene pas être numérique. Depuis $ALERTest toujours numérique, $usepdoit être le coupable. Il y a plusieurs problèmes avec la façon dont vous analysez la sortie dhdont le résultat $usepn'est pas numérique.

Selon la longueur des systèmes de fichiers, dhpeut diviser sa sortie sur plusieurs lignes. Des lignes partielles seront prises dans votre filtre et entraîneront des données absurdes. Pour éviter ce comportement et obtenir une sortie analysable à partir de dh, passez l' -Poption.

dfImprime également une ligne d'en-tête qui entraînera à nouveau des données absurdes.

Votre filtre est assez complexe. J'utiliserais un seul passage de awk. Pour cette question, vous pouvez filtrer 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==1correspond à la première ligne, NR==1 {next}saute donc la première ligne. Les lignes suivantes excluent certains systèmes de fichiers (notez que votre description indique que vous êtes intéressé 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 préférable d'envoyer un seul e-mail sur tous les systèmes de fichiers. Cette fois, je fais toute l'analyse 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 

6

Si vous changez d'impression en printf à l'aide de% d, le pourcentage deviendra un entier. Essayer:

printf("%d", $5);

qui convertira 91% en 91. La commande finale est donc la suivante:

df -H | grep /dev/xvde1 | awk '{ printf "%d", $5}'

La commande ci-dessus en anglais: "Obtenez l'utilisation de l'espace disque dans un format lisible par l'homme. Filtrez vers le bas avec grep sur le disque que nous voulons regarder. Dirigez cette ligne vers awk et imprimez le 5ème mot délimité par l'espace (vides supprimés), et formatez la chaîne résultante sous forme d'entier. Pour moi, la commande renvoie l'entier, 78ce qui signifie que le disque est plein à 78%.


3
$ df | tail +2 | sed s/%//g | awk '{ if($5 > 90) print "Alert "$0;}'
  • df | tail +2 prend toute la sortie après avoir sauté les 2 premières lignes
  • sed s/%//g dépouille les signes de pourcentage
  • awk ... affiche "Alerte ..." si le 5ème champ dans la sortie est un nombre supérieur à 90

1
Bienvenue sur Stack Exchange! Nous recherchons de longues réponses qui fournissent une explication et un contexte. Ne vous contentez pas de donner une réponse sur une seule ligne; expliquer comment cela fonctionne. Les réponses qui ne contiennent pas d'explications peuvent être supprimées.
G-Man dit 'Réinstalle Monica'

0

voici ma variante:

#!/bin/bash

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

0

Je ne suis pas en mesure de commenter la réponse de Gilles ci-dessus, mais sachez simplement que awk effectue une comparaison basée sur des chaînes dans la deuxième partie, où:

$5 >= ALERT

Je l'ai remarqué lorsque je testais des seuils à un chiffre. Vous pouvez forcer un transtypage en int en utilisant +0, de sorte que la comparaison devient:

$5+0 >= ALERT
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.