Utilizzo del disco per utente in Linux / Unix


10

Devo scoprire quanto spazio su disco è occupato da ciascun utente sulla rete. Sono a conoscenza dfe ducomandi: potrei elencare l'intero filesystem e AWK l'output, ma mi chiedo se esiste un comando più standard.

L'output che sto cercando è:

usr1  xMb
usr2  yMb
[...]
Total zMb

Qualche idea?

Grazie!

PS. Red Hat Linux EE

Risposte:


11

È una cosa sola o è questa informazione che vuoi essere in grado di estrarre regolarmente? Nel caso sia successiva, un'opzione è quella di applicare le quote sul tuo filesystem. In questo modo il sistema tiene costantemente traccia della quantità di dati utilizzati da ciascun utente. In questo modo le informazioni sono semplicemente una query nel database delle quote.


1
La quota +1 è la soluzione!
ThorstenS,

Una cosa una tantum; possibilmente una soluzione che può essere memorizzata in un piccolo script affinché gli utenti possano calcolarne l'utilizzo se lo desiderano. Non possiamo limitare la quantità di dati a causa del tipo di lavoro che svolgiamo non soddisfa limiti rigidi.
Escualo,

@ThorstenS: Facciamo il calcolo tecnico e dobbiamo generare tonnellate di informazioni che possono essere rimosse o meno dopo l'esecuzione di una corsa. Non credo che le quote ci aiutino nella nostra situazione.
Escualo,

1
@Arrieta: non devi limitarne l'utilizzo. Basta dare ad ogni utente una quota ridicolmente alta. Inoltre, ogni utente può da solo interrogare il database delle quote e vedere quanti dati stanno attualmente archiviando.
Andol,

2
Non è nemmeno necessario impostare la quota su un numero elevato, se non viene impostata (ovvero 0) non la imporrà, ma ne registrerà l'utilizzo
Daniel,

4

Un'altra bella soluzione che ho trovato qui . Passa alla directory di interesse ed esegui (in alternativa, .passa alla directory che ti interessa, ad es . /home/):

find . -type f -printf "%u  %s\n" \
  | awk '{user[$1]+=$2}; END{for(i in user) print i,user[i]}'

1
+1. Forse aggiungi un tipo f stai davvero cercando solo file?
Hennes,

Buona risposta. Usa -printf "%u\t%s\n"e awk -v OFS="\t"se pensi di poter mai avere un nome utente con spazio all'interno.
TheDudeAbides,

3

O per trovare gli utenti problematici (anche le directory),

du -xk | sort -n | tail -25

e per Solaris:

du -dk | sort -n | tail -25   

Questo ti dà un elenco delle 25 più grandi directory. Non proprio quello che mi hai chiesto, ma lo uso sempre.


2

Quello che facciamo in molti luoghi è usare il sistema delle quote, ma impostare quote assurdamente alte. In questo modo si ottiene il vantaggio di un reporting rapido. In un sito, ogni utente ha 1 TB di spazio "quota".

Aumentiamo periodicamente la quota più alta man mano che cresce il disco utile: inizialmente era di 30 GB per utente, qualcosa che era assurdamente alto al momento.


0

Non esiste tale comando. Devi scrivere alcuni comandi di shell per questo.

  1. ottenere tutti gli utenti da / etc / passwd con uid> 1000
  2. usa find -uid e cerca tutti i file dell'utente
  3. usa questo elenco per alimentare du -s

Inefficiente. Non è necessario eseguire find più volte se si registrano le informazioni contemporaneamente. Salvare tali informazioni durante la prima esecuzione. In un file o in un array associativo.
Hennes,

0

Il metodo di ThorstenS sembra che mi occorra più lavoro di quanto sia necessario perché viene trovato più volte. Per uno, farei solo 1 comando find, e output il proprietario e la dimensione di ogni file, e quindi fare un po 'di magia su quel file.

La ricerca sarebbe qualcosa del tipo che restituisce nome utente (o numero ID senza nome utente) e spazio utilizzato in byte, in un file delimitato da null byte:

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

Puoi sostituirlo \0con qualcosa che potrebbe essere un po 'più facile da lavorare, come schede o newline, ma sarebbe meno sicuro se hai nomi di file funky.

Se vuoi essere ancora più efficiente, potresti indirizzare l'output allo script che lo gestisce mentre viene eseguito, ma sarebbe un po 'più di lavoro e dovresti farlo correttamente la prima volta.


0

Ce l'ho fatta :) Non veloce, ma funziona:

#!/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

Un grande aumento della velocità si verificherà se cerchiamo solo UID> 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.