PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Belegter Speicher pro User anzeigen?



dingeling
06.10.04, 12:30
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?

carnil
06.10.04, 14:47
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, 14: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

carnil
06.10.04, 14:57
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, 15: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.

$kuLL
06.10.04, 15:38
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.

dingeling
06.10.04, 15:53
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.

$kuLL
06.10.04, 16:12
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).

dingeling
06.10.04, 16:25
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

$kuLL
06.10.04, 18:44
#/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

dingeling
06.10.04, 19:35
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

dingeling
11.10.04, 22:14
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