Uso de disco por usuário no Linux / Unix

10

Preciso descobrir quanto espaço em disco está sendo ocupado por cada usuário na rede. Estou ciente dfe ducomandos: eu poderia listar todo o sistema de arquivos e AWK a saída, mas me pergunto se existe um comando mais padrão.

A saída que estou procurando é:

usr1  xMb
usr2  yMb
[...]
Total zMb

Alguma ideia?

Obrigado!

PS. Red Hat Linux EE

Escualo
fonte

Respostas:

11

Isso é algo único ou essas informações você deseja extrair regularmente? Caso seja o mais recente, uma opção é aplicar cotas ao seu sistema de arquivos. Fazendo isso, o sistema monitora continuamente a quantidade de dados usada por cada usuário. Dessa forma, as informações são apenas uma consulta ao banco de dados de cotas.

andol
fonte
1
Cota de +1 é a solução!
ThorstenS
Uma coisa única; possivelmente uma solução que possa ser armazenada em um pequeno script para que os usuários calculem seu uso, se quiserem. Não podemos limitar a quantidade de dados, porque o tipo de trabalho que fazemos não acomoda limites rígidos.
Escualo 15/12/09
@ ThorstenS: Fazemos computação técnica e precisamos gerar toneladas de informações que podem ou não ser removidas após a execução. Não acho que cotas ajudem em nossa situação.
Escualo 15/12/09
1
@Arrieta: Você não precisa limitar o uso deles. Simplesmente dê a cada usuário uma cota ridiculamente alta. Além disso, cada usuário pode, por si só, consultar o banco de dados de cotas e ver quantos dados estão armazenando no momento.
andol 15/12/2009
2
Você não precisa mesmo de definir a cota para um número grande, se você deixá-lo unset (ou seja, 0) que não irá aplicá-la, mas ele irá gravar o uso
Daniel
4

Outra boa solução que encontrei aqui . Navegue até o diretório de interesse e execute (como alternativa, mude .para o diretório que mais lhe interessar, por exemplo , /home/):

find . -type f -printf "%u  %s\n" \
  | awk '{user[$1]+=$2}; END{for(i in user) print i,user[i]}'
Jonas
fonte
1
+1. Talvez adicione um tipo-f, você está realmente procurando apenas arquivos?
Hennes
Boa resposta. Use -printf "%u\t%s\n"e awk -v OFS="\t"se você acha que pode ter um nome de usuário com espaço nele.
TheDudeAbides 12/09/19
3

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

du -xk | sort -n | tail -25

e para Solaris:

du -dk | sort -n | tail -25   

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

Ronald Pottol
fonte
2

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

Periodicamente, aumentamos a cota mais alta à medida que o disco reparável cresce - inicialmente era de 30 GB por usuário, algo absurdamente alto na época.

David Mackintosh
fonte
0

Não existe esse comando. Você precisa escrever alguns comandos de 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
ThorstenS
fonte
Ineficiente. Você não precisa executar o find várias vezes se registrar as informações ao mesmo tempo. Salve essas informações durante sua primeira execução. Em um arquivo ou em uma matriz associativa.
Hennes
0

O método do ThorstenS parece ser mais trabalhoso do que o necessário para mim, porque ele é executado várias vezes. Por um lado, eu apenas faria 1 comando find, e exibia o proprietário e o tamanho de cada arquivo e, em seguida, faria algum tipo de mágica nesse arquivo.

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

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

Você pode substituir \0por algo que possa ser um pouco mais fácil de trabalhar, como guias ou novas linhas, mas que seria menos seguro se você tiver nomes de arquivos descolados.

Se você quisesse ser ainda mais eficiente, poderia canalizar a saída para um script que lida com ela à medida que é executado, mas isso seria um pouco mais trabalhoso e você precisaria acertar na primeira vez.

Kyle Brandt
fonte
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 procurarmos apenas UIDs> 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
fonte