Hata, bağımsız değişkenlerden -ge
birinin sayısal olmamasından kaynaklanmaktadır. Yana $ALERT
hep sayısal, $usep
suçlu olmak zorunda. Çıktısını ayrıştırma yönteminizde sayısal olmayan dh
sonuçlarla ilgili birkaç sorun vardır $usep
.
Dosya sistemlerinin uzunluğuna bağlı olarak, dh
çıktısını birkaç satıra bölebilir. Kısmi satırlar filtrenize takılır ve saçma verilerle sonuçlanır. Bu davranışı önlemek ve ayrıştırılabilir çıktı almak dh
için -P
seçeneği iletin .
Ayrıca df
yine saçma verilerle sonuçlanacak bir başlık satırı yazdırır.
Filtreniz oldukça karmaşık. Ben awk tek bir geçiş kullanmak istiyorum. Bu nedenle, awk içindeki yüzde üzerinde filtreleme yapabilirdiniz (ancak aşağıdaki komut dosyasında yapmadım).
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
ilk satırla eşleştiğinden ilk satırı NR==1 {next}
atlar. Sonraki birkaç satır bazı dosya sistemlerini hariç tutar (açıklamanızın ilgilendiğinizi söylüyor abc:/xyz/pqr
, ancak kodunuzun hariç tuttuğunu unutmayın). Son awk satırı %
yazdırmadan önce yüzde sütunundan kaldırır .
Tüm dosya sistemleri hakkında tek bir posta göndermek daha iyi olur. Bu sefer tüm analizi awk olarak yapıyorum.
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