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