Penggunaan disk per pengguna di Linux / Unix

10

Saya perlu mencari tahu berapa banyak ruang disk yang ditempati oleh setiap pengguna di jaringan. Saya sadar dfdan dumemerintahkan: Saya bisa mendaftar seluruh sistem file dan AWK output, tapi saya ingin tahu apakah ada perintah yang lebih standar.

Output yang saya cari adalah:

usr1  xMb
usr2  yMb
[...]
Total zMb

Ada ide?

Terima kasih!

PS. Red Hat Linux EE

Escualo
sumber

Jawaban:

11

Apakah ini satu kali, atau apakah informasi ini Anda ingin dapat mengekstrak secara teratur? Jika ini adalah yang terakhir maka satu opsi adalah menerapkan kuota pada sistem file Anda. Melakukan hal itu sistem terus melacak jumlah data yang digunakan oleh setiap pengguna. Dengan cara itu informasi hanyalah kueri ke basis data kuota.

andol
sumber
1
Kuota +1 adalah solusinya!
ThorstenS
Suatu hal satu kali; mungkin solusi yang dapat disimpan dalam skrip kecil bagi pengguna untuk menghitung penggunaannya jika mereka mau. Kami tidak dapat membatasi jumlah data karena jenis pekerjaan yang kami lakukan tidak mengakomodasi batas keras.
Escualo
@ThorstenS: Kami melakukan komputasi teknis dan kami perlu menghasilkan banyak informasi yang mungkin atau tidak dapat dihapus setelah dijalankan. Saya tidak berpikir kuota membantu dalam situasi kita.
Escualo
1
@ Arrieta: Anda tidak harus membatasi penggunaannya. Cukup beri setiap pengguna kuotanya sangat tinggi. Selain itu, setiap pengguna dapat dengan sendirinya meminta basis data kuota dan melihat berapa banyak data yang mereka simpan saat ini.
andol
2
Anda bahkan tidak perlu mengatur kuota untuk sejumlah besar, jika Anda meninggalkannya unset (yaitu 0) tidak akan menegakkannya, tetapi akan merekam penggunaan
Daniel
4

Solusi bagus lain yang saya temukan di sini . Arahkan ke direktori yang menarik, dan jalankan (alternatifnya, ubah .ke direktori mana saja yang menarik minat Anda, misalnya , /home/):

find . -type f -printf "%u  %s\n" \
  | awk '{user[$1]+=$2}; END{for(i in user) print i,user[i]}'
Jonas
sumber
1
+1. Mungkin tambahkan -tipe f apakah Anda benar-benar hanya mencari file?
Hennes
Jawaban yang bagus. Gunakan -printf "%u\t%s\n"dan awk -v OFS="\t"jika Anda merasa pernah memiliki nama pengguna dengan ruang di dalamnya.
TheDudeAbides
3

Atau untuk menemukan pengguna yang bermasalah (direktori juga),

du -xk | sort -n | tail -25

dan untuk Solaris:

du -dk | sort -n | tail -25   

Ini memberi Anda daftar 25 direktori terbesar. Tidak cukup dengan apa yang Anda minta, tapi saya menggunakannya sepanjang waktu.

Ronald Pottol
sumber
2

Apa yang kami lakukan di banyak tempat adalah menggunakan sistem kuota, tetapi menetapkan kuota sangat tinggi. Dengan cara ini Anda mendapatkan manfaat dari pelaporan cepat. Di satu situs, setiap pengguna memiliki ruang "kuota" 1 TB.

Kami secara berkala meningkatkan kuota seiring peningkatan disk yang dapat diservis - awalnya 30GB per pengguna, sesuatu yang sangat tinggi pada saat itu.

David Mackintosh
sumber
0

Tidak ada perintah seperti itu. Anda harus menulis beberapa perintah shell untuk ini.

  1. dapatkan semua pengguna dari / etc / passwd dengan uid> 1000
  2. gunakan find -uid dan cari semua file pengguna
  3. gunakan daftar ini untuk memberi makan du -s
ThorstenS
sumber
Tidak efisien Anda tidak perlu menjalankan pencarian beberapa kali jika Anda mencatat informasi dalam waktu yang bersamaan. Simpan informasi itu selama menjalankan pertama Anda. Baik dalam file, atau dalam array asosiatif.
Hennes
0

Metode ThorstenS tampaknya seperti lebih banyak pekerjaan yang diperlukan bagiku karena ia menjalankan pencarian beberapa kali. Untuk sekali saja, saya hanya akan melakukan 1 perintah, dan menampilkan pemilik dan ukuran setiap file, dan kemudian melakukan semacam sihir pada file itu.

Temuan tersebut akan berupa sesuatu yang mengembalikan nama pengguna (atau nomor id tanpa nama pengguna) dan ruang yang digunakan dalam byte, dalam file terbatas null-byte:

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

Anda dapat mengganti \0dengan sesuatu yang mungkin sedikit lebih mudah untuk dikerjakan, seperti tab atau baris baru, tetapi itu akan kurang aman jika Anda memiliki nama file yang funky.

Jika Anda ingin menjadi lebih efisien, Anda bisa menyalurkan output ke skrip yang menanganinya saat berjalan, tetapi itu akan menjadi lebih banyak pekerjaan, dan Anda harus memperbaikinya pertama kali.

Kyle Brandt
sumber
0

Saya sudah membuatnya :) Tidak cepat, tetapi bekerja:

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

Peningkatan kecepatan luar biasa akan terjadi jika kami hanya mencari UID yang> 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
sumber