Команда df для одного сценария awk
Необходим сценарий для получения общего свободного пространства, использования, процента использования, порогового значения состояния диска "КРИТИЧЕСКИЙ", "ПРЕДУПРЕЖДЕНИЕ" и "ОК" на двух разных серверах, каждый из которых специально фильтровал только две файловые системы каждая; сервер1 /dev/md10, /dev/md11 и сервер2 /dev/md12, /dev/md13.
вывод df с сервера1:
Filesystem 1K-blocks Used Available Use% Mounted on
rootfs 52403200 4965112 47438088 10% /
/dev/sda3 229393988 8134836 221259152 4% /scratch
/dev/drbd0 194767012 26942356 167824656 14% /Containers
/dev/md11 187396112384 169024117776 18371994608 91% /sic001c2
/dev/md10 187396112384 91319318884 96076793500 49% /sic001c1
вывод df с сервера2:
Filesystem 1K-blocks Used Available Use% Mounted on
rootfs 52403200 4900936 47502264 10% /
/dev/sda3 229393988 8487936 220906052 4% /scratch
/dev/drbd0 194767012 26942356 167824656 14% /Containers
/dev/md12 187396112384 169096078544 18300033840 91% /sic001c3
/dev/md13 187396112384 169570140196 17825972188 91% /sic001c4
Вот ссылка на скрипт @tripleee
#!/bin/bash
# use a loop to reduce duplication of ssh options etc
while read -r server mounts; do
ssh "$server" df -m --no-sync "$mounts"
done <<\____SERVER__MOUNTS |
server1 /dev/md10 /dev/md11
server2 /dev/md12 /dev/md13
____SERVER__MOUNTS
# sed -e /^Filesystem/d inlined into Awk below
sort |
# pipe into awk
awk 'BEGIN { print "UDS:\nserver1 & server2"
# Maybe use printf here too
print "Mounted on Free space Disk usage Use% Disk state"
}
! /^Filesystem/ {
# Awk conveniently ignores any trailing string
# so you can compare 95% to 95 numerically
if ($5 > 95) status=" CRITICAL"
else if ($5 > 90) status=" WARNING"
else status="OK"
printf "%-20s %8s %12s %6s %4s\n", $6, $4, $3, $5, status
# EdmCoff''s hack, too lazy to change to legible variable names
# adapted to defer division until we know the final value of n
free+=$4;usage+=$3;use+=$5;n++
}
END { printf "\n%-16s %12s %12s %5s%%\n",
"Total", free, usage, use/n }'
Текущий вывод из скрипта:
UDS:
server1 & server2
Mounted on Free space Disk usage Use% Disk state
/sic001c1 93824552 89179465 49% OK
/sic001c2 17913453 165090564 91% WARNING
Grand total 111738005 254270029 70%
Ничего плохого в скрипте у них просто отлично работает. Единственным заметным является то, что server2 - выходной результат не показан. Я изменил строки 6 и 7, чтобы найти оба устройства на обоих серверах, используя звездочку (*), результат вывода одинаков (как показано выше). Также, чтобы добавить, мне нужно общее пороговое значение состояния диска и процент использования, чтобы округлить, я действительно не знаю, что и как собрать это вместе.
Результат вывода должен:
UDS:
server1 & server2
Mounted on Free space Disk usage Use% Disk state
/sic001c1 93824552 89179465 49% OK
/sic001c2 17913453 165090564 91% WARNING
/sic001c3 17821802 165182215 91% WARNING
/sic001c4 17361175 165642842 91% WARNING
---------------------------------------------------------------
Total 146920982 585095086 81% OK