Chci implementovat skript na svůj server, který bude automaticky odesílat e-mailová upozornění, pokud využití disku překročí 90 %, a druhé e-mailové upozornění, když překročí 95 %. Můj souborový systém je abc:/xyz/abc
a bod připojení je /pqr
.
Zkoušel jsem toto:
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
Ale dostávám chybu, která říká
line 7: [: Use: integer expression expected
Přijatá odpověď:
Chyba je způsobena jedním z argumentů -ge
není číselný. Od $ALERT
je vždy číselné, $usep
musí být viníkem. Existuje několik problémů se způsobem, jakým analyzujete výstup dh
což má za následek $usep
není číselný.
V závislosti na délkách souborových systémů dh
může rozdělit svůj výstup na několik řádků. Částečné čáry budou zachyceny ve vašem filtru a výsledkem budou nesmyslná data. Chcete-li se tomuto chování vyhnout a získat analyzovatelný výstup z dh
, předejte -P
možnost.
Také df
vytiskne řádek záhlaví, což opět povede k nesmyslným datům.
Váš filtr je poměrně složitý. Použil bych jeden průchod awk. V tomto případě můžete provést filtrování podle procenta uvnitř awk (ale v následujícím skriptu jsem to neudělal).
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
odpovídá prvnímu řádku, takže NR==1 {next}
přeskočí první řádek. Následující řádky vylučují některé souborové systémy (všimněte si, že váš popis říká, že vás zajímá abc:/xyz/pqr
, ale váš kód to vylučuje). Poslední řádek awk odstraní %
ze sloupce procent před tiskem.
Bylo by lepší poslat jeden mail o všech souborových systémech. Tentokrát provádím veškerou analýzu v 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