L'erreur est due à l'un des arguments pour -ge
ne pas être 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 dh
dont le résultat $usep
n'est pas numérique.
Selon la longueur des systèmes de fichiers, dh
peut 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' -P
option.
df
Imprime é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==1
correspond à 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
Gilles 'SO- arrête d'être méchant'
la source
voici ma variante:
la source
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ù:
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:
la source