Linux / Unix'te kullanıcı başına disk kullanımı


10

Ağdaki her kullanıcı tarafından ne kadar disk alanı işgal edildiğini bulmak gerekir. Biliyorum dfve dukomutlar: Tüm dosya sistemini listeleyebilir ve çıktıyı AWK yapabilirim, ancak daha standart bir komut olup olmadığını merak ediyorum.

Aradığım çıktı:

usr1  xMb
usr2  yMb
[...]
Total zMb

Herhangi bir fikir?

Teşekkürler!

PS. Red Hat Linux EE

Yanıtlar:


11

Bu bir defalık bir şey mi, yoksa düzenli olarak elde etmek istediğiniz bu bilgi mi? Daha sonra olması durumunda, seçeneklerden biri dosya sisteminize kota uygulamaktır. Sistemin sürekli olarak yapılması, her kullanıcı tarafından kullanılan veri miktarını takip eder. Bu şekilde bilgi sadece kota veritabanına giden bir sorgudur.


1
+1 kotası çözüm!
ThorstenS

Bir kerelik bir şey; kullanıcıların istedikleri takdirde kullanımlarını hesaplamaları için küçük bir komut dosyasında saklanabilecek bir çözüm olabilir. Yaptığımız iş türü zor sınırlar içermediğinden veri miktarını sınırlayamayız.
Escualo

@ThorstenS: Teknik bilgi işlem yapıyoruz ve koşu yapıldıktan sonra kaldırılabilecek veya kaldırılmayacak tonlarca bilgi üretmemiz gerekiyor. Durumumuzda kotaların yardımcı olduğunu düşünmüyorum.
Escualo

1
@Arrieta: Kullanımlarını sınırlamanız gerekmez. Her kullanıcıya gülünç bir yükseklik kotası verin. Ayrıca, her kullanıcı kendi başına kota veritabanını sorgulayabilir ve şu anda ne kadar veri depoladığını görebilir.
andol

2
Kotayı büyük bir sayıya ayarlamanız bile gerekmez, eğer ayarsız bırakırsanız (yani 0) zorlamaz, ancak kullanımı kaydeder
Daniel

4

Burada bulduğum bir başka güzel çözüm . Gezin ilgi dizine ve run (alternatif olarak değişiklik .hangisi dizin çıkarları için size, örneğin , /home/):

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

1
+1. Belki de sadece bir dosya mı arıyorsunuz?
Hennes

İyi cevap. Kullanın -printf "%u\t%s\n"ve awk -v OFS="\t"sen düşünüyorsan hiç o alana sahip bir kullanıcı adı olabilir.
thedudeabides

3

Veya sorunlu kullanıcıları bulmak için (dizinler de),

du -xk | sort -n | tail -25

ve Solaris için:

du -dk | sort -n | tail -25   

Bu size en büyük 25 dizinin bir listesini verir. Tam olarak istediğin şey değil, ama her zaman kullanıyorum.


2

Birçok yerde yaptığımız şey kota sistemini kullanmak, ancak saçma sapan yüksek kotalar koymak. Bu şekilde hızlı raporlama avantajından faydalanırsınız. Bir sitede, her kullanıcının 1 TB "kota" alanı vardır.

Kullanılabilir disk büyüdükçe kotayı periyodik olarak daha yüksek bir değere çarpıyoruz - başlangıçta kullanıcı başına 30 GB'dı, o zaman saçma bir şekilde yüksekti.


0

Böyle bir emir yok. Bunun için bazı kabuk komutları yazmalısınız.

  1. uid> 1000 ile / etc / passwd dizininden tüm kullanıcıları edinin
  2. find -uid komutunu kullanın ve kullanıcının tüm dosyalarında arama yapın
  3. du -s beslemek için bu listeyi kullan

Yetersiz. Bilgileri aynı anda kaydederseniz find komutunu birkaç kez çalıştırmanıza gerek yoktur. İlk çalıştırma sırasında bu bilgileri kaydedin. Bir dosyada veya ilişkilendirilebilir bir dizide.
Hennes

0

ThorstenS'in yöntemi benim için daha fazla iş gerekiyor gibi görünüyor çünkü birden fazla kez çalışıyor. Bir kereye mahsus olmak için, sadece 1 find komutu yapacağım ve her dosyanın sahibini ve boyutunu çıkaracağım ve sonra bu dosyada bir tür sihir yapardım.

Bul, boş baytla ayrılmış bir dosyada kullanıcı adını (veya kullanıcı adı olmayan kimlik numarasını) ve baytlarda kullanılan alanı döndüren bir şey olabilir:

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

\0Sekmelerini veya yeni satırları gibi, çalışması biraz daha kolay olabilecek bir şeyle değiştirebilirsiniz , ancak funky dosya adlarınız varsa daha az güvenli olur.

Daha da verimli olmak istiyorsanız, çıktıyı çalıştığı gibi işleyen komut dosyasına bağlayabilirsiniz, ancak bu biraz daha fazla iş olurdu ve ilk seferinde doğru yapmanız gerekir.


0

Başardım :) Hızlı değilsiniz, ama çalışıyor:

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

Yalnızca> 1000 olan UID'leri ararsak büyük hız artışı gerçekleşir:

- 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.