[gelöst] Warnung vor zu vollem $HOME

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Taomon
Beiträge: 627
Registriert: 08.03.2011 16:34:38
Lizenz eigener Beiträge: GNU Free Documentation License

[gelöst] Warnung vor zu vollem $HOME

Beitrag von Taomon » 09.10.2017 10:08:29

Ich möchte erreichen, wenn mein $HOME einen bestimmten GB überschreitet, das ich eine Warnung über notify-send kriege, wenn ich mich anmelde. Wieso geht das so nicht.

Code: Alles auswählen

cat du.sh 
#!/bin/bash

if /usr/bin/du -hs $HOME -lt 300GB > /dev/null; then 
exit 0;
else /usr/bin/notify-send -i /usr/share/icons/gnome/48x48/status/dialog-warning.png "Warnung" "home voll"
fi
Executable-Flag ist vorhanden. Wo habe ich geschlampt?

Code: Alles auswählen

bash --version
GNU bash, Version 4.4.12(1)-release (x86_64-pc-linux-gnu)
Wenn ich es ausführe krieg ich keine Fehlermeldung, aber auch keine Bubble.

Code: Alles auswählen

alex@Taomon:~/bin$ du -hs $HOME
394G	/home/alex
alex@Taomon:~/bin$ 




Taomon
Zuletzt geändert von Taomon am 09.10.2017 18:39:33, insgesamt 1-mal geändert.
Bitte gelegentliche Schreibfehler übersehen. Ich habe ADHS. Danke.

Benutzeravatar
smutbert
Moderator
Beiträge: 8316
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Warnung vor zu vollem $HOME

Beitrag von smutbert » 09.10.2017 10:33:22

Was genau meinst du denn mit der Optionen -lt 300GB zu erreichen?
Laut manpage zählt -l die Zahl der Hardlinks, die dir wahrscheinlich egal ist und t sorgt dafür, dass Dateien/Verzeichnisse, die weniger als xGB belegen, nicht aufgelistet werden, damit erreichst du möglicherweise schon eher was du willst, aber der Exitstatus, den if auswertet wird normalerweise unabhängig vom Speicherverbrauch 0 sein.

Ich würde auf eine erste Eingebung hin, die Zeilen der Ausgabe von du zählen:

Code: Alles auswählen

#!/bin/bash
MAX_USAGE=300GB

if test $(du -h ${HOME} -t ${MAX_USAGE} | wc -l) -gt 0; then
   notify-send -i dialog-warning "Warnung" "home voll"
fi

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: Warnung vor zu vollem $HOME

Beitrag von MSfree » 09.10.2017 10:35:46

Taomon hat geschrieben: ↑ zum Beitrag ↑
09.10.2017 10:08:29
Wieso geht das so nicht.

Code: Alles auswählen

if /usr/bin/du -hs $HOME -lt 300GB > /dev/null; then
Weil /usr/bin/du -hs $HOME keinen Zahlenwert zurückliefert sondern einen String in der Form:

Code: Alles auswählen

799M    /home/MSfree
"-lt" kann nur reine Zahlen vergleichen. Strings mit Buchstaben, z.B. "799M" und/oder "300GB" sind nicht mit diesem Operator vergleichbar.

Besonders gut ist die Idee, den Platz bei jedem Login mit du zu prüfen, auch nicht. Auf meinem Rechner sind ggfls. unter Home Netzlaufwerke gemountet, die in das Ergebnis einbezogen werden und vor allem bei großen Netzlaufwerken auch durchaus mal mehrere Minuten Zeit in Anspruch nehmen können, bevor das Ergebnis kommt. Willst du wirklich solche Zeitverzögerungen mit jedem Login?

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Warnung vor zu vollem $HOME

Beitrag von Meillo » 09.10.2017 10:48:27

Fuer `-lt' brauchst du test(1), also:

Code: Alles auswählen

if [ ... -lt ... ] ; then
Statt absoluten Zahlen wuerde ich den Prozentwert der Nutzung vergleichen, weil dann das Script auch bei neuen Festplatten noch funktioniert, ausserdem hat der keine Einheit, weshalb du ihn (nachdem du die reine Prozentzahl rausgeschnitten hast) einfacher vergleichen kannst.

Ich habe ein Script, das genau das macht und bei knappem Platz eine Mail schickt. Leider komme ich im Moment nicht an den Rechner auf dem das liegt. Ich hoffe, ich denke heute Abend dran, das zu posten.


Edit: Ich bin ganz automatisch davon ausgegangen, dass man df(1) dafuer verwenden wird und hab gar nicht gesehen, dass du(1) zum Einsatz kam. Du(1) hat natuerlich keine Prozentausgaben, df(1) schon.
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Warnung vor zu vollem $HOME

Beitrag von Meillo » 09.10.2017 10:51:45

MSfree hat geschrieben: ↑ zum Beitrag ↑
09.10.2017 10:35:46
Besonders gut ist die Idee, den Platz bei jedem Login mit du zu prüfen, auch nicht. Auf meinem Rechner sind ggfls. unter Home Netzlaufwerke gemountet, die in das Ergebnis einbezogen werden und vor allem bei großen Netzlaufwerken auch durchaus mal mehrere Minuten Zeit in Anspruch nehmen können, bevor das Ergebnis kommt. Willst du wirklich solche Zeitverzögerungen mit jedem Login?
Ausserdem listet du(1) nur den belegten Platz auf den zu Zugriff hast, waehrend df(1) auflistest wieviel des Dateisystems belegt ist.
Use ed once in a while!

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: Warnung vor zu vollem $HOME

Beitrag von MSfree » 09.10.2017 11:36:19

Meillo hat geschrieben: ↑ zum Beitrag ↑
09.10.2017 10:48:27
Fuer `-lt' brauchst du test(1), also:
bash unterstützt das auch als built-in.

Ich denke aber, daß man bei einem Mehrbenutzersystem eher auf quota gehen sollte. Bei einem persönlichen System kann ich auch mal schnell mit df nachschauen und bin ggfls. sowieso selbst schuld an der vollen Platte.

Benutzeravatar
Taomon
Beiträge: 627
Registriert: 08.03.2011 16:34:38
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Warnung vor zu vollem $HOME

Beitrag von Taomon » 09.10.2017 13:00:49

Oh, vielen Dank zusammen. Ich habe echt mal wieder ein Vertipper drin gehabt. Sorry.

Code: Alles auswählen

#!/bin/bash

if /usr/bin/du -hs $HOME -le 300GB > /dev/null; then 
exit 0;
else /usr/bin/notify-send -i /usr/share/icons/gnome/48x48/status/dialog-warning.png "Warnung" "home voll"
fi
Ich dachte -le bedeutet weniger oder gleich in der bash. So krieg ich wenigstens einen Fehler zurück.

Code: Alles auswählen

alex@Taomon:~/bin$ ./du.sh 
/usr/bin/du: Ungültige Option -- e
„/usr/bin/du --help“ liefert weitere Informationen.
Zumindest funktioniert da der Bubble. :lol:
Hab ich das jetzt richtig verstanden, funktioniert so nicht, da keine reine Zahl von du kommt.


Hier ist ein sind nur 2 $HOMES relevant. meines und das für user Kodi, da ich einen kodi als standalone hingepfrimelt habe, falls ich den Rechner nur für Musik hören oder Filmchen schauen nutze.
MSfree hat geschrieben: ↑ zum Beitrag ↑
09.10.2017 10:35:46
Besonders gut ist die Idee, den Platz bei jedem Login mit du zu prüfen, auch nicht. Auf meinem Rechner sind ggfls. unter Home Netzlaufwerke gemountet, die in das Ergebnis einbezogen werden und vor allem bei großen Netzlaufwerken auch durchaus mal mehrere Minuten Zeit in Anspruch nehmen können, bevor das Ergebnis kommt. Willst du wirklich solche Zeitverzögerungen mit jedem Login?
Keine Netzlaufwerke mehr hier vorhanden. Also Lesebrille wieder auf und nochmal lesen. :THX:

Gruß Taomon
Bitte gelegentliche Schreibfehler übersehen. Ich habe ADHS. Danke.

Benutzeravatar
smutbert
Moderator
Beiträge: 8316
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Warnung vor zu vollem $HOME

Beitrag von smutbert » 09.10.2017 13:22:09

-lt bedeutet als Option von "test" (!) weniger, du hast aber -lt bzw. jetzt -le als Option von "du" verwendet und gar kein test aufgerufen. Außerdem, wenn du Zahlen vergleichen willst, kannst du eine Einheit hinter der Zahl sowieso nicht gebrauchen.
Entweder machst du es also zB so wie in meinem Post (mein Beispiel funktioniert), bei dem ich schlicht Zeilen der Ausgabe mit "wc -l" zähle und die dann vergleiche (mindestens eine Zeile bedeutet, dass das Verzeichnis mehr Platz beansprucht als angegeben) oder du filters aus deiner Befehlsausgabe irgendwie die nackte Zahl heraus, aber das ist schon etwas schwieriger, vor allem musst du dich dann eventuell auch um die Umrechnung in die passende Einheit kümmern.

Ein "test" wirst du aber so oder so benötigen und bei dem kannst du dann auch die Option -lt oder -le verwenden.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Warnung vor zu vollem $HOME

Beitrag von Meillo » 09.10.2017 13:33:25

MSfree hat geschrieben: ↑ zum Beitrag ↑
09.10.2017 11:36:19
Meillo hat geschrieben: ↑ zum Beitrag ↑
09.10.2017 10:48:27
Fuer `-lt' brauchst du test(1), also:
bash unterstützt das auch als built-in.
Du meinst, dass die Bash `test' als Built-in hat und zielst damit auf mein ``(1)'' ab? Bzw. kann man [[ ]] verwenden. Da stimme ich dir zu.

Aber im Codebeispiel ist gar keine Art von `test' zu finden, es steht ja nur ``if .... -le ... ; then'' da, und so geht das doch sicher auch in der Bash nicht.

Zudem bekommt ja immer noch du(1) die Optionen `-le' uebergeben, weil da noch eine Command-Substitution fehlt.

@Taomon: Mein Vorschlag ist, dass du nochmal frisch anfaengst, und den Befehl Schritt fuer Schritt aufbaust. Dann wird dir die logische Struktur deines Befehls und die da vorhandenen Fehler vielleicht auch klarer. Zudem: Lies die Fehlermeldung genau: Da steht, dass `du' (!) keine Option `e' kennt ... mit der Bash hat das gar nichts zu tun, weil die dein `-le' gar nicht verarbeitet.
Use ed once in a while!

Benutzeravatar
Taomon
Beiträge: 627
Registriert: 08.03.2011 16:34:38
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Warnung vor zu vollem $HOME

Beitrag von Taomon » 09.10.2017 16:38:48

Nächter Versuch :D

Code: Alles auswählen

#!/bin/bash
a=300
b=`/usr/bin/du -hs $HOME | sed 's/[^0-9]//g'`
if test [$b -gt $a] then 
/usr/bin/notify-send -i /usr/share/icons/gnome/48x48/status/dialog-warning.png "Warnung" "home voll"
ganz toll

Code: Alles auswählen

alex@Taomon:~/bin$ ./du.sh 
./du.sh: Zeile 8: Syntax Fehler: Unerwartetes Dateiende.
alex@Taomon:~/bin$ 
Oh,ja Befehe zu verketten ist toll.

Code: Alles auswählen

alex@Taomon:~/bin$ /usr/bin/du -hs $HOME | sed 's/[^0-9]//g'
394
alex@Taomon:~/bin$ 
'
Jetzt habe ich eine reine Zahlenausgabe. Kann ich die Ausgabe des Befehls mit du so als Variable setzen zum vergleichen?

Gruß Taomon
Bitte gelegentliche Schreibfehler übersehen. Ich habe ADHS. Danke.

Benutzeravatar
smutbert
Moderator
Beiträge: 8316
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Warnung vor zu vollem $HOME

Beitrag von smutbert » 09.10.2017 16:56:40

Du hast zwar die reine Zahl, aber nicht die Einheit (mit du -h können das u. a. KB, MB oder GB sein).

Wenn man das beisiete lässt: Mit $(...) kannst du den Befehl beim Ausführen durch seine Ausgabe ersetzen genauso wie du mit ${...} den Namen der Variablen durch den Wert ersetzt. In der Bash geht das auch mit ``, also genau so wie du es mit b=`...` bereits gemacht hast

Code: Alles auswählen

a=300
b=$(/usr/bin/du -hs $HOME | sed 's/[^0-9]//g')
[ ... ] ist im wesentlich dasselbe wie test, also entweder oder und nicht beides auf einmal.
Ein fi am Ende des if-Konstruktes und ein Semikolon vor dem then brauchst du aber auf jeden Fall.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Warnung vor zu vollem $HOME

Beitrag von Meillo » 09.10.2017 17:06:47

Taomon hat geschrieben: ↑ zum Beitrag ↑
09.10.2017 16:38:48
Nächter Versuch :D
Schoen, dass du daran arbeitest, auch wenn es ziemlich viel Trial'n'Error ist.
Taomon hat geschrieben: ↑ zum Beitrag ↑
09.10.2017 16:38:48

Code: Alles auswählen

#!/bin/bash
a=300
b=`/usr/bin/du -hs $HOME | sed 's/[^0-9]//g'`
if test [$b -gt $a] then 
/usr/bin/notify-send -i /usr/share/icons/gnome/48x48/status/dialog-warning.png "Warnung" "home voll"
ganz toll

Code: Alles auswählen

alex@Taomon:~/bin$ ./du.sh 
./du.sh: Zeile 8: Syntax Fehler: Unerwartetes Dateiende.
alex@Taomon:~/bin$ 
Es fehlt ein `fi', um das `if' zu beenden, darum bekommst du das unerwartete Dateiende.

Du musst entweder `test' oder die eckige Klammer verwenden. Das sind beides Aliase fuer das gleiche.

Um die eckigen Klammern muss Whitespace sein.

Nach der schliessenden eckigen Klammer fehlt ein Strichpunkt.

Variablen-Expansionen solltest du mit doppelten Anfuehrungszeichen quoten.


... wir kommen dem korrekten Script naeher. ;-)


Edit: Aeh, grossteils hat smutbert in seinem letzten Absatz das Gleiche auch schon geschrieben.
Use ed once in a while!

Benutzeravatar
Taomon
Beiträge: 627
Registriert: 08.03.2011 16:34:38
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Warnung vor zu vollem $HOME

Beitrag von Taomon » 09.10.2017 17:48:53

Danke für Geduld. Irgendwie will die Variable für $b nich.

Code: Alles auswählen

#!/bin/bash
a=300
b=`/usr/bin/du -hs $HOME | sed 's/[^0-9]//g'`
if [$b -gt $a] ;
then
/usr/bin/notify-send -i /usr/share/icons/gnome/48x48/status/dialog-warning.png "Warnung" "home voll"
fi
beim ausführen,

Code: Alles auswählen

alex@Taomon:~/bin$ ./du.sh 
./du.sh: Zeile 4: [394: Kommando nicht gefunden.
alex@Taomon:~/bin$ 
Danke bash. :evil:
smutbert hat geschrieben: ↑ zum Beitrag ↑
09.10.2017 16:56:40
Du hast zwar die reine Zahl, aber nicht die Einheit (mit du -h können das u. a. KB, MB oder GB sein).
Ist das von Bedeutung, wenn ich einfach 2 Zahlenwerte miteinander vergleichen will? Mit () anstatt Backticks kommt die selbe Meldung.

Gruß Taomon
Bitte gelegentliche Schreibfehler übersehen. Ich habe ADHS. Danke.

Benutzeravatar
smutbert
Moderator
Beiträge: 8316
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Warnung vor zu vollem $HOME

Beitrag von smutbert » 09.10.2017 17:55:33

Es ist von Bedeutung wenn du wissen willst ob 2 mehr als 300 ist, die 300 aber Gigabyte und die 2 Terabyte sind :wink:

Du hast ein paar (notwendige) Leerzeichen ausgelassen

Code: Alles auswählen

[ $b -gt $a ]
oder

Code: Alles auswählen

test $b -gt $a

Benutzeravatar
Taomon
Beiträge: 627
Registriert: 08.03.2011 16:34:38
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Warnung vor zu vollem $HOME

Beitrag von Taomon » 09.10.2017 18:07:01

smutbert hat geschrieben: ↑ zum Beitrag ↑
09.10.2017 17:55:33
Es ist von Bedeutung wenn du wissen willst ob 2 mehr als 300 ist, die 300 aber Gigabyte und die 2 Terabyte sind :wink:

Du hast ein paar (notwendige) Leerzeichen ausgelassen


Die Platte hat ingesamt nur 1 TB.

Hüstel, ich habe die Leerzeichen versehentlich außerhalb der eckigen Klammern gesetzt. :oops:

Nur eine Wurzelbehandlung ist noch schöner :P


Danke schön Taomon
Bitte gelegentliche Schreibfehler übersehen. Ich habe ADHS. Danke.

Benutzeravatar
smutbert
Moderator
Beiträge: 8316
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Warnung vor zu vollem $HOME

Beitrag von smutbert » 09.10.2017 18:12:16

Taomon hat geschrieben: ↑ zum Beitrag ↑
09.10.2017 18:07:01
[…]
Die Platte hat ingesamt nur 1 TB.
[…]
Dann denk dir das Beispiel mit MB und GB. Es kommen bei der Abfrage mit "du" z. B. 800 heraus und du willst wissen ob das mehr als 300 sind, ersteres sind aber MB und zweiteres GB.

Benutzeravatar
Taomon
Beiträge: 627
Registriert: 08.03.2011 16:34:38
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Warnung vor zu vollem $HOME

Beitrag von Taomon » 09.10.2017 18:38:39

smutbert hat geschrieben: ↑ zum Beitrag ↑
09.10.2017 18:12:16
Dann denk dir das Beispiel mit MB und GB. Es kommen bei der Abfrage mit "du" z. B. 800 heraus und du willst wissen ob das mehr als 300 sind, ersteres sind aber MB und zweiteres GB.
Berechtigter Einwand, aber für meinen Hausgebrauch reichts.

Komplett sieht es jetzt so aus.

Code: Alles auswählen

#!/bin/bash
a=900
b=`/usr/bin/du -hs $HOME | sed 's/[^0-9]//g'`
if [ $b -lt $a ]; then 
/usr/bin/notify-send "noch Platz"; 
else
/usr/bin/notify-send -i /usr/share/icons/gnome/48x48/status/dialog-warning.png "Warnung" "home voll"
fi
Sowas macht mir Migräne. Gib mir ein kaputtes apt oder dpkg, das ist leichter für mich.


Gruß und :THX: Taomon
Bitte gelegentliche Schreibfehler übersehen. Ich habe ADHS. Danke.

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: Warnung vor zu vollem $HOME

Beitrag von MSfree » 09.10.2017 19:39:49

Taomon hat geschrieben: ↑ zum Beitrag ↑
09.10.2017 18:38:39
Berechtigter Einwand, aber für meinen Hausgebrauch reichts.
Naja, am einfachsten wäre es, statt -h einfach -m für du zu verwenden. Dann kommen nämlich immer Megabytes raus statt des "Human Readable Formats".

Code: Alles auswählen

du -ms ~
Würde das Mehrdeutigkeitsproblem ganz einfach lösen.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Warnung vor zu vollem $HOME

Beitrag von Meillo » 09.10.2017 22:50:15

Meillo hat geschrieben: ↑ zum Beitrag ↑
09.10.2017 10:48:27
Ich habe ein Script, das genau das macht und bei knappem Platz eine Mail schickt. Leider komme ich im Moment nicht an den Rechner auf dem das liegt. Ich hoffe, ich denke heute Abend dran, das zu posten.
Hier mein Script:

Code: Alles auswählen

#!/bin/sh

warn=70

out="`df -h | awk 'NR>1 && $5>'$warn`"
test "x$out" = "x" && exit 0
echo "$out" | mail -s "Warning: Disks of `hostname` >$warn%" root
Es ist nicht besonders schoen (beim Vergleich z.B. haette man -z verwenden koennen, und der Prozentwert ist hardcoded), aber das Script ist wenigstens kurz. ;-)
Use ed once in a while!

Antworten