Wykorzystanie dysku na użytkownika w systemie Linux / Unix

10

Muszę dowiedzieć się, ile miejsca na dysku zajmuje każdy użytkownik w sieci. Jestem świadomy dfi dupoleceń: mógłbym wymienić cały system plików i AWK dane wyjściowe, ale zastanawiam się, czy istnieje bardziej standardowe polecenie.

Wynik, którego szukam to:

usr1  xMb
usr2  yMb
[...]
Total zMb

Jakieś pomysły?

Dzięki!

PS. Red Hat Linux EE

Escualo
źródło

Odpowiedzi:

11

Czy to jednorazowa sprawa, czy te informacje, które chcesz regularnie otrzymywać? W przypadku, gdy jest to później, jedną z opcji jest zastosowanie limitów w systemie plików. W ten sposób system stale śledzi ilość danych wykorzystywanych przez każdego użytkownika. W ten sposób informacja jest jedynie zapytaniem do bazy danych przydziałów.

andol
źródło
1
Kwota +1 to rozwiązanie!
ThorstenS,
Rzecz jednorazowa; być może rozwiązanie, które można zapisać w małym skrypcie, aby użytkownicy mogli obliczyć ich użycie, jeśli chcą. Nie możemy ograniczać ilości danych, ponieważ rodzaj wykonywanej pracy nie uwzględnia twardych limitów.
Escualo,
@ThorstenS: Wykonujemy obliczenia techniczne i musimy wygenerować mnóstwo informacji, które mogą, ale nie muszą, zostać usunięte po uruchomieniu. Nie sądzę, aby kwoty były pomocne w naszej sytuacji.
Escualo,
1
@Arrieta: Nie musisz ograniczać ich użycia. Po prostu daj każdemu użytkownikowi absurdalnie wysoką kwotę. Ponadto każdy użytkownik może samodzielnie zapytać o bazę danych przydziałów i zobaczyć, ile danych obecnie przechowuje.
andol
2
Nie musisz nawet ustawiać limitu na dużą liczbę, jeśli nie ustawisz go (tj. 0), nie będzie go egzekwował, ale zarejestruje użycie
Daniel
4

Znalazłem tu inne fajne rozwiązanie . Przejdź do katalogu, zainteresowania i uruchom (alternatywnie, zmiana .na dowolny katalog interesy ty, np , /home/):

find . -type f -printf "%u  %s\n" \
  | awk '{user[$1]+=$2}; END{for(i in user) print i,user[i]}'
Jonas
źródło
1
+1. Może dodać typ f, czy naprawdę szukasz tylko plików?
Hennes
Dobra odpowiedź. Używać -printf "%u\t%s\n"i awk -v OFS="\t"jeśli uważasz, że kiedykolwiek może mieć nazwę użytkownika z miejsca w nim.
TheDudeAbides,
3

Lub w celu znalezienia problematycznych użytkowników (także katalogów),

du -xk | sort -n | tail -25

a dla Solaris:

du -dk | sort -n | tail -25   

To daje listę 25 największych katalogów. Nie do końca o co prosiłeś, ale używam tego cały czas.

Ronald Pottol
źródło
2

To, co robimy w wielu miejscach, to stosowanie systemu kwot, ale ustanawianie absurdalnie wysokich kwot. W ten sposób zyskujesz szybkie raportowanie. W jednej witrynie każdy użytkownik ma 1 TB miejsca „przydziału”.

Okresowo zwiększamy limit, gdy rośnie dysk serwisowalny - początkowo było to 30 GB na użytkownika, co było wtedy absurdalnie wysokie.

David Mackintosh
źródło
0

Nie ma takiego polecenia. W tym celu musisz napisać kilka poleceń powłoki.

  1. pobierz wszystkich użytkowników z / etc / passwd z identyfikatorem użytkownika> 1000
  2. użyj find -uid i przeszukaj wszystkie pliki użytkownika
  3. użyj tej listy do karmienia du-s
ThorstenS
źródło
Nieskuteczny. Nie musisz kilkakrotnie uruchamiać wyszukiwania, jeśli logujesz informacje w tym samym czasie. Zapisz te informacje podczas pierwszego uruchomienia. Albo w pliku, albo w tablicy asocjacyjnej.
Hennes
0

Wydaje mi się, że metoda ThorstenS wymaga więcej pracy, ponieważ działa wiele razy. Na przykład, po prostu wykonałbym 1 polecenie find, wypisałbym właściciela i rozmiar każdego pliku, a następnie wykonałem jakąś magię na tym pliku.

Znalezienie byłoby czymś, co zwraca nazwę użytkownika (lub numer identyfikacyjny bez nazwy użytkownika) i miejsce używane w bajtach, w pliku rozdzielanym zerami:

sudo bash -c 'find . -printf "%u\0%s\0" > username_usage'

Możesz zastąpić \0je czymś, co może być nieco łatwiejsze w pracy, takie jak tabulatory lub nowe linie, ale byłoby to mniej bezpieczne, jeśli masz funky nazwy plików.

Jeśli chcesz być jeszcze bardziej wydajny, możesz przesłać dane wyjściowe do skryptu, który obsługuje go podczas działania, ale byłoby to trochę więcej pracy i musiałbyś to zrobić za pierwszym razem.

Kyle Brandt
źródło
0

Zrobiłem to :) Nie szybko, ale działa:

#!/bin/bash

# Displays disk usage per user in the specified directory
# Usage: ./scriptname [target-directory]

[ "x$1" == "x" ] && dirname="." || dirname="$1"
for uid in `cat /etc/passwd |awk -F : '{ print $1 }' ` ; do # List all usernames
    user_size=0
    for file in `find "$dirname" -type f -user "$uid" 2>/dev/null` ; do # List the folder's files that belongs to the current user, Ignore possible `find` errors.
        let user_size+=`stat -c '%s' $file` # Sum-up
        done
    [ $user_size -gt 0 ] && echo "USER=$uid, SIZE=$user_size" # Display the result if >0
    done

Znaczny wzrost prędkości nastąpi, jeśli szukamy tylko identyfikatorów UID, które są> 1000:

- for uid in `cat /etc/passwd | sed -rn "s~^([^:]+):.*$~\1~p"` ; do # List all usernames
+ for uid in `cat /etc/passwd | sed -rn "s~^([^:]+):[^:]:[0-9]{4,}:.*$~\1~p"` ; do # List all usernames having UID>1000
kolypto
źródło