Uso de disco por usuário no Linux / Unix

8

Eu preciso descobrir quanto espaço em disco está sendo ocupado por cada usuário na rede. Estou ciente dos comandos df e du : eu poderia listar todo o sistema de arquivos e AWK a saída, mas gostaria de saber se existe um comando mais padrão.

A saída que estou procurando é:

usr1  xMb
usr2  yMb
[...]
Total zMb

Alguma idéia?

Obrigado!

PS. Red Hat Linux EE

    
por Escualo 15.12.2009 / 20:40

7 respostas

11

Isso é uma coisa de uma vez, ou essa informação você quer extrair regularmente? Caso seja o último, uma opção é aplicar cotas no seu sistema de arquivos. Fazendo isso, o sistema continuamente monitora a quantidade de dados usada por cada usuário. Dessa forma, a informação é apenas uma consulta ao banco de dados de cotas de distância.

    
por 15.12.2009 / 20:47
3

Outra boa solução que encontrei aqui . Navegue até o diretório de interesse e execute (altivamente, altere . para qualquer diretório que o interesse, por exemplo, /home/ ):

find . -printf "%u  %s\n" | awk '{user[$1]+=$2}; END{ for( i in user) print i " " user[i]}'
    
por 28.08.2011 / 15:32
3

Ou para encontrar os usuários problemáticos (diretórios também)

du -xk | sort -n | tail -25

e para o Solaris:

du -dk | sort -n | tail -25   

Isso lhe dá uma lista dos 25 maiores diretórios. Não é bem o que você pediu, mas eu uso o tempo todo.

    
por 16.12.2009 / 01:57
2

O que fazemos em muitos lugares é usar o sistema de cotas, mas estabelecemos cotas absurdamente altas. Dessa forma, você obtém o benefício de relatórios rápidos. Em um site, cada usuário tem 1 TB de espaço de "cota".

Aumentamos a cota periodicamente à medida que o disco aumenta - inicialmente, eram 30 GB por usuário, algo que era absurdamente alto na época.

    
por 15.12.2009 / 20:57
0

Não há tal comando. Você tem que escrever alguns comandos shell para isso.

  1. obtenha todos os usuários de / etc / passwd com uid > 1000
  2. use find -uid e pesquise todos os arquivos do usuário
  3. use esta lista para alimentar du -s
por 15.12.2009 / 20:47
0

O método de ThorstenS parece mais trabalho do que o necessário, porque ele é executado várias vezes. Para um, eu apenas faria um comando find, e daria a saída do dono e do tamanho de cada arquivo, e faria algum tipo de mágica nesse arquivo.

A localização seria algo como o que retorna o nome de usuário (ou número de identificação sem nome de usuário) e o espaço usado em bytes, em um arquivo delimitado por byte nulo:

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

Você pode substituir o %code% por algo que pode ser um pouco mais fácil de se trabalhar, como guias ou novas linhas, mas isso seria menos seguro se você tivesse nomes de arquivos originais.

Se você quisesse ser ainda mais eficiente, poderia canalizar a saída para o script que a manipula à medida que ela é executada, mas isso seria um pouco mais trabalhoso e você teria que acertar da primeira vez.

    
por 15.12.2009 / 20:55
0

Eu fiz isso :) Não é rápido, mas funciona:

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

Um grande aumento de velocidade ocorrerá se buscarmos apenas UIDs que sejam > 1000:

- for uid in 'cat /etc/passwd | sed -rn "s~^([^:]+):.*$~~p"' ; do # List all usernames
+ for uid in 'cat /etc/passwd | sed -rn "s~^([^:]+):[^:]:[0-9]{4,}:.*$~~p"' ; do # List all usernames having UID>1000
    
por 18.12.2009 / 04:03