Archiv verlassen und diese Seite im Standarddesign anzeigen : Belegter Speicher pro User anzeigen?
Hi,
was ist die einfachste Möglichkeit, den belegten Speicherplatz pro User anzuzeigen? Und zwar will ich einmal am Tag auswerten, wie hoch der Speicherplatz einzelner Verzeichnise von unterschiedlichen Usern ist.
Z.b User1 = 40mb , User2 200mb usw.
find kann ja nach usern suchen, doch leider summiert er mir das Ergebnis nicht sondern wertet jede suche einzeln aus:
find /var -uid 1000 -exec du -hs {} \; > /var/Daten/userdisk
Wie kann ich nun sagen das er mir alles summiert ausgibt?
Oder gibts da Tools die das können?
Hi
Ich kann nicht so gut Programmieren, deshalb kann es durchaus sein, dass das nicht so eine gute Lösung ist, aber vielleicht ein Anfang, welches man dann total abändern kann oder verbessern könnte:
find /var -uid 1000 -exec du -s {} \; > /tmp/Daten/userdisk
awk '{s += $1} END {print "sum is", s}' /tmp/Daten/userdisk
Wie gesagt, ich kann nicht so gut Programmieren, hoffe aber, dass trotzdem nichts unnötiges drinn ist. (ich habe für solche sachen meist immer ein oder meherer Manpages geöffnet :(, letzeren Teil, steht z.B. so ziemlich ähnlich auch in der manpage zu awk)
Wichtiges Edit: Ok, vergessen! Es stimmt irgendwie nicht ganz, eigentlich irgendwie übehaupt nicht ...
MfG carnil
Terran Marine
06.10.04, 13:53
Hi
Ich kann nicht so gut Programmieren, deshalb kann es durchaus sein, dass das nicht so eine gute Lösung ist, aber vielleicht ein Anfang, welches man dann total abändern kann oder verbessern könnte:
find /var -uid 1000 -exec du -s {} \; > /tmp/Daten/userdisk
awk '{s += $1} END {print "sum is", s}' /tmp/Daten/userdisk
Wie gesagt, ich kann nicht so gut Programmieren, hoffe aber, dass trotzdem nichts unnötiges drinn ist. (ich habe für solche sachen meist immer ein oder meherer Manpages geöffnet :(, letzeren Teil, steht z.B. so ziemlich ähnlich auch in der manpage zu awk)
MfG carnil
Geht auch einfacher :
du -sh /home/*
Gruß
Terran
Hi
Geht auch einfacher :
du -sh /home/*
Gruß
Terran
Ok, meine Lösung stimmt sowieso überhaupt nicht (irgendwie, könnte sein es stimmt, aber davon 100% überzeugt bin ich nicht), wenn ich dingeling richtig verstehe, möchte er ja aber unter /var zunächst alle Dateien finden, die dem User mit der uid 1000 gehören, finden, und dann deren Grösse zusammenzählen?
Wenn, ich das obige Problem aber falsch verstanden habe, dann entschuldigung (hatte nur Lust, ein "neues" spannendes Problem anzugehen).
MfG carnil
Terran Marine
06.10.04, 14:03
Hi
Ok, meine Lösung stimmt sowieso überhaupt nicht, wenn ich dingeling richtig verstehe, möchte er ja aber unter /var zunächst alle Dateien finden, die dem User mit der uid 1000 gehören, finden, und dann deren Grösse zusammenzählen?
Achso, ich bin von einfachen home-Verzeichnissen ausgegangen. Naja soll sich der Threadersteller nochmals melden und konkretisieren.
Quick & dirty:
SUM=0; for i in `find /var/ -uid 1000 -type f`; do n=`du -s $i | awk '{print $1}'`; SUM=$(($SUM+$n)); done; echo "Gesamt: $SUM KByte"
Der Ansatz sollte dir weiterhelfen.
Edit: bei meiner Lösung werden die 4 Kb der Verzeichnisse nicht berücksichtigt. Nur die Dateien.
Schöne Kommandosubstitution :ugly: Bringt mir aber nen Fehler:
bash: 6860+: syntax error: operand expected (error token is "+")
Aber der Ansatz ist gut, werd ich mal austesten.
@carnil Genau so ist es, wie du es sagst. Ein du -sh /var würde mir ja alle Dateien zählen. Wenn aber verschiedene User Dateien ablegen dürfen wirds schwerer. Und für meine Auswertungen ist einfach genial zu wissen, wer wo wieviel ablegt.
Das ganze kann man dann in ein kleines Script legen und um Mitternacht einmal ausführen, da kann er ruhig etwas brauchen.
EDIT
Der Fehler kommt, wenn er auf Dateien mit Sonderzeichen trifft, z.b. Leerzeichen. Wer das mal in Anführungsstrichen stellen, obs hilft weis ich noch nicht.
Achso, sowas gibt es bei mir nicht ;) deswegen auch quick & dirty.
Die Anführungszeichen werden dir nicht viel bringen.
Nutze statt der for eine while Schleife und lies zeilenweise ein (read).
Achso, sowas gibt es bei mir nicht ;) deswegen auch quick & dirty.
Die Anführungszeichen werden dir nicht viel bringen.
Nutze statt der for eine while Schleife und lies zeilenweise ein (read).
Jop, bringt nix da das Ergebniss in der Variable mit Leerzeichen ist.
Muss ich dann daheim mal meine Schulungsunterlagen rauskramen.
PS: Samba - WindowsUser - mehr sag ich zu den Leerzeichen in Dateinamen nicht :p
#/bin/sh
SUM=0
d=$(expr `find /home -uid 65001 -type d | wc -l` \* 4)
find /home/ -uid 65001 -type f | while read line; do
f=`du -s $line 2>/dev/null | awk '{print $1}'`
SUM=$(($SUM+$f)); echo $SUM > /tmp/diskspace.tmp
done
echo "Gesamt: $(expr `cat /tmp/diskspace.tmp` + $d) kb"
rm /tmp/diskspace.tmp
So müsste es gehen. Dass die for Schleife mit Leerzeichen nicht umgehen kann war klar, aber selbst das zeilenweise Einlesen machte Probleme. Aber read gibt trotzdem das Verzeichnis (oder die Datei) als Zeile an (plus einen Error), so dass man einfach nur die Standardfehlerausgabe rausschneiden muss :D
Great work, das schaut doch ganz ordenlich aus :)
Wenn ich nur eher ins Forum geschaut hätte, war hier ne Stund mit while read beschäftigt, und das wollte, wie du schon sagst, einfach nicht funzen :ugly:
Scheinbar bin ich zu doof dafür (wohlgemerkt ich bin kein bashprofi).
Dafür hätt ich warscheinlich 2 Tage gebraucht :D
Also thx für die grosse Hilfe, wenn mein Scriptlein gar fertig ist werd ichs posten, werds erst mal in snmp(mrtg) einbinden und testen
Lieder bin ich mit der Lösung immer wieder auf Problemen gestossen, gerade bei Sonderzeichen. Jetzt hab ich einen ganz anderen Ansatz probiert. Hat mich zwar ein bisschen Zeit gekostet, um mich wieder in die Materie einzuarbeiten aber was solls.
Ok, hier schonmal das Grundgerüst:
#!/bin/bash
if [ "$1" == "-u" ]
then
uid1=`echo $2`
else
uid1=`echo $4`
fi
if [ "$1" == "-d" ]
then
dir1=`echo $2`
else
dir1=`echo $4`
fi
dir2=`echo $dir1 |cut -d/ -f2`
IFS=
for i in `echo $uid1`; do
IFS=","
set -- $i
done
while [ -n "$1" ]; do
DRU=`find $dir1 -uid $1 -type f -exec du -k {} \; 2> /dev/null`
echo $DRU > /tmp/$1.$dir2.tmp
echo $[`awk 'BEGIN{F=0}{F+=$0}END{print F}' /tmp/$1.$dir2.tmp`/1024] > /tmp/$1.$dir2.tmp
echo "uid $1 belegt `cat /tmp/$1.$dir2.tmp` Megabyte"
shift
done
Ok, soweit so gut, User können mehrere mit Komma getrennt eingeben werden, und ein Verzeichnis. Aber nun zum Poblem: wenn ich vieeele Dateien hab (so ab 20.000) bekomm ich kein Ergebnis mehr. Läuft die Variable über? Vieleicht fällt einem dazu was ein bevor ichs gar fertig mache.
Achja, Syntax ist ./script -d /home -u 1000,1001,1002
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.