PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Freien Speicher per Skript melden?



BenWish
09-01-2009, 09:19
Hallo zusammen,

ich bräuchte ein Skript, welches mir den freien Speicher der einzelnen Partitionen ausliest und bei Überschreitung eines gewissen Wertes eine Syslog-Warnung ausgibt.
Per df -k sehe ich ja die Kapazität in %. Gibt es ne Möglichkeit die Auszulesen und zeilenweise auszuwerten? Also wenn eine Partition z.B. mehr als 75% belegt ist, dass dann diese Zeile per logger als Syslog-Meldung ausgegeben wird?

Vielen Dank schonmal im Voraus,
Gruß,
BenWish

fork
11-01-2009, 23:49
Hallo BenWish,

Du stellst aber Fragen. Ich würde mir aber schon wünschen, das Du Dich selbst etwas mit Shellprogrammierung beschäftigst, bevor Du so etwas einfaches fragst. Ich könnte mir vorstellen, das viele Dich deswegen ignorieren würden.

Weil mir das gerade Spaß macht, bekommst Du die Antwort trotzdem.



LC_ALL=C df -l | tail -n +2 | while read line; do
set $line
for val in $*;do
a=$b; b=$c ; c=$e ; e=$f ; f=$val
[ "${val%\%}" != "$val" ] && [ "${val%\%}" -gt 75 ] && \
logger -p local7.warn "WARNUNG: Geraet $a hat einen Fuellstand von $val"
done
done


Die zwei "test"-Ausdrücke( [ ... ] ) kann man nicht zusammenfassen, da immer beide ausgewertet werden, und nicht der rechte nur wenn der Linke wahr ergibt. Das würde in dem Fall einen Syntaxfehler ergeben, da ${val%\%} nicht immer numerisch ist.

Das mit dem LC_ALL=C ist hier nicht notwendig, ansonsten aber prinzipiell eine gute Idee wenn man Ausgabe von Kommandos parst. Denn damit erzeugst Du immer die englische Ausgabe und erlebst keine Überraschungen, wenn Du dann mal eine andere Umgebung hast. Z. B. die von "root" ist oft englisch eingestellt.

Hinweis: df zeigt bei überlangen Gerätenamen wie eingehängten Samba-Freigaben oder LVM-Partitionen die Informationen zweizeilig an. Der obige Scriptschnipsel berücksichtigt das.

jan61
14-01-2009, 23:16
Moin,


...


LC_ALL=C df -l | tail -n +2 | while read line; do
set $line
for val in $*;do
a=$b; b=$c ; c=$e ; e=$f ; f=$val
[ "${val%\%}" != "$val" ] && [ "${val%\%}" -gt 75 ] && \
logger -p local7.warn "WARNUNG: Geraet $a hat einen Fuellstand von $val"
done
done
...

Nö, das meinst Du nicht ernst, oder? ;-)

Zuerst mal: Was hast Du nur immer mit dem set? Das kannst Du in der obigen Situation doch einfach so machen: for val in $line; do

Und die innere Schleife verstehe ich mal einfach als Machbarkeitsstudie ;-) Du ratterst über alle Einzelwerte, um die Felder mit einem Prozentzeichen zu finden, zu prüfen und dann das 5. Feld davor mit auszugeben - das geht doch auch ohne diese Verrenkung, die Variablen ständig umshiften zu müssen! Man merkt sich einfach das FS, wenn es vorbeikommt - man muss es ja nicht gleich ausgeben.

Ich musste mir erstmal einen NFS-Mount basteln, um eine 2-zeilige Anzeige zu kriegen:
jan@jack:~/tmp> df -k
Dateisystem 1K-Blöcke Benutzt Verfügbar Ben% Eingehängt auf
/dev/hda6 497829 305923 166204 65% /
tmpfs 516856 8 516848 1% /dev/shm
/dev/hda7 101086 10668 85199 12% /boot
/dev/hda11 78534372 67459120 7085916 91% /home
/dev/hda10 3099260 1067648 1874180 37% /opt
/dev/hda8 5162796 2535904 2364636 52% /usr
/dev/hda9 1035660 285004 698048 29% /var
/dev/hda2 5234976 3209004 2025972 62% /pictures
/dev/hda3 20962560 18772696 2189864 90% /music
duddits:/home/jan/Development/workspace/dataHandler/src/de
10417792 8324864 2092928 80% /mnt
jan@jack:~/tmp> df -k | tail -n +2 | while read line; do
> # Zeile in einem Array speichern
> arr=($line)
> # nur 1 Feld: 2-zeilige Anzeige, FS merken
> # 6 Felder: 1-zeilige Anzeige, FS merken
> test -z "${arr[1]}" -o -n "${arr[5]}" && fs=${arr[0]}
> # 6 Felder: 1-zeilige Anzeige, % steht im 5. Feld
> # alle anderen Faelle: Feld 4 merken, wenn nicht leer, dann %-Wert
> test -n "${arr[5]}" && proz=${arr[4]%\%} || proz=${arr[3]%\%}
> # wenn $proz gefuellt ist, dann pruefen + Ausgabe
> test -n "$proz" -a 0$proz -gt 75 && echo "[$fs] [$proz]"
> done # Fertig
[/dev/hda11] [91]
[/dev/hda3] [90]
[duddits:/home/jan/Development/workspace/dataHandler/src/de] [80]
Jan

EDIT: Man kann sich übrigens auch die Array-Zuweisung sparen, mit "... | while read -a arr; do" wird das Array gleich beim Einlesen gefüllt. Der Code ohne Kommentare sieht dann schön kompakt so aus:


df -k | tail -n +2 | while read -a arr; do
test -z "${arr[1]}" -o -n "${arr[5]}" && fs=${arr[0]}
test -n "${arr[5]}" && proz=${arr[4]%\%} || proz=${arr[3]%\%}
test -n "$proz" -a 0$proz -gt 75 && echo "[$fs] [$proz]"
done

undefined
15-01-2009, 08:15
Und ich würde dafür den quota daemon verwenden und mir das ganze shell script schreiben sparen . ;)

jan61
18-01-2009, 12:40
Moin,

den Zusammenhang verstehe ich nicht. Quota dient meinem Verständnis nach zum Limitieren des Festplattenverbrauchs pro Benutzer / Gruppe unterhalb der physikalischen Limits (also Dateisystemgröße). Hier war aber genau nach der Auslastung der Platte unabhängig von Benutzern gefragt worden.

Jan