การใช้งานดิสก์ต่อผู้ใช้ใน Linux / Unix


10

ฉันต้องการทราบว่าผู้ใช้แต่ละคนมีพื้นที่ว่างในดิสก์เท่าใดในเครือข่าย ฉันรู้dfและduคำสั่ง: ฉันสามารถแสดงรายการระบบไฟล์ทั้งหมดและ AWK ผลลัพธ์ แต่ฉันสงสัยว่ามีคำสั่งมาตรฐานมากขึ้น

ผลลัพธ์ที่ฉันกำลังมองหาคือ:

usr1  xMb
usr2  yMb
[...]
Total zMb

ความคิดใด ๆ

ขอบคุณ!

PS Red Hat Linux EE

คำตอบ:


11

นี่เป็นเพียงครั้งเดียวหรือเป็นข้อมูลที่คุณต้องการสกัดเป็นประจำหรือไม่ ในกรณีที่มันเป็นภายหลังแล้วตัวเลือกหนึ่งคือการใช้โควต้าในระบบไฟล์ของคุณ การทำเช่นนั้นระบบจะติดตามปริมาณข้อมูลที่ผู้ใช้แต่ละคนใช้อย่างต่อเนื่อง วิธีการที่ข้อมูลเป็นเพียงแบบสอบถามไปยังฐานข้อมูลโควต้าออกไป


1
+1 โควต้าเป็นทางออก!
ThorstenS

สิ่งหนึ่งครั้ง; อาจเป็นโซลูชันที่สามารถเก็บไว้ในสคริปต์ขนาดเล็กสำหรับผู้ใช้เพื่อคำนวณการใช้งานของพวกเขาหากพวกเขาต้องการ เราไม่สามารถ จำกัด ปริมาณข้อมูลได้เนื่องจากประเภทของงานที่เราทำไม่รองรับขีด จำกัด อย่างหนัก
Escualo

@ThorstenS: เราทำการคำนวณทางเทคนิคและเราจำเป็นต้องสร้างข้อมูลจำนวนมากซึ่งอาจหรือไม่อาจถูกลบออกหลังจากทำการรัน ฉันไม่คิดว่าโควต้าช่วยในสถานการณ์ของเรา
Escualo

1
@Aririeta: คุณไม่จำเป็นต้อง จำกัด การใช้งาน เพียงให้โควต้าสูงแก่ผู้ใช้แต่ละคน นอกจากนี้ผู้ใช้ทุกคนสามารถค้นหาฐานข้อมูลโควต้าด้วยตนเองและดูจำนวนข้อมูลที่พวกเขากำลังจัดเก็บอยู่ในปัจจุบัน
andol

2
คุณไม่จำเป็นต้องตั้งโควต้าเป็นจำนวนมากถ้าคุณปล่อยให้มันไม่มีการตั้งค่า (เช่น 0) มันจะไม่บังคับใช้ แต่มันจะบันทึกการใช้งาน
Daniel

4

อีกวิธีที่ดีที่ผมพบว่าที่นี่ นำทางไปยังไดเรกทอรีที่น่าสนใจและเรียกใช้ (ผลัดเปลี่ยนแปลง.ไปแล้วแต่จำนวนใดสนใจไดเรกทอรีคุณเช่น , /home/):

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

1
+1 อาจจะเพิ่ม -type f คุณแค่มองหาไฟล์จริงๆเหรอ?
Hennes

คำตอบที่ดี. ใช้-printf "%u\t%s\n"และawk -v OFS="\t"ถ้าคุณคิดว่าคุณเคยอาจจะมีชื่อผู้ใช้ที่มีพื้นที่อยู่ในนั้น
TheDudeAbides

3

หรือสำหรับการค้นหาผู้ใช้ที่มีปัญหา (ไดเรกทอรีด้วย)

du -xk | sort -n | tail -25

และสำหรับ Solaris:

du -dk | sort -n | tail -25   

นี่เป็นรายการของไดเรกทอรีที่ใหญ่ที่สุด 25 รายการ ไม่ใช่สิ่งที่คุณขอ แต่ฉันใช้มันตลอดเวลา


2

สิ่งที่เราทำในหลาย ๆ แห่งคือใช้ระบบโควต้า แต่ตั้งโควต้าสูงอย่างไร้เหตุผล วิธีนี้ทำให้คุณได้รับประโยชน์จากการรายงานที่รวดเร็ว ที่ไซต์เดียวผู้ใช้แต่ละคนมีพื้นที่ "โควต้า" 1 TB

เราเพิ่มโควต้าเป็นระยะ ๆ เมื่อดิสก์ที่ให้บริการเติบโตขึ้นในขั้นต้นมันคือ 30GB ต่อผู้ใช้บางสิ่งที่สูงเกินจริงในเวลานั้น


0

ไม่มีคำสั่งดังกล่าว คุณต้องเขียนคำสั่งเชลล์สำหรับคำสั่งนี้

  1. รับผู้ใช้ทั้งหมดจาก / etc / passwd ด้วย uid> 1,000
  2. ใช้ find -uid และค้นหาไฟล์ทั้งหมดของผู้ใช้
  3. ใช้รายการนี้เพื่อป้อน du -s

ไม่มีประสิทธิภาพ คุณไม่จำเป็นต้องเรียกใช้ค้นหาหลาย ๆ ครั้งถ้าคุณบันทึกข้อมูลในเวลาเดียวกัน บันทึกข้อมูลนั้นในระหว่างการเรียกใช้ครั้งแรกของคุณ ไม่ว่าจะเป็นไฟล์หรือในอาเรย์แบบเชื่อมโยง
Hennes

0

ดูเหมือนว่าวิธีการของ ThorstenS จะต้องใช้งานมากกว่านี้เพราะมันทำงานได้หลายครั้ง สำหรับการปิดหนึ่งฉันจะทำ 1 คำสั่งค้นหาและส่งออกเจ้าของและขนาดของแต่ละไฟล์แล้วทำมายากลเรียงลำดับในไฟล์นั้น

การค้นหาจะเหมือนกับชื่อที่ส่งคืนชื่อผู้ใช้ (หรือหมายเลข id ที่ไม่มีชื่อผู้ใช้) และพื้นที่ที่ใช้เป็นไบต์ในไฟล์ที่คั่นด้วย null-byte:

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

คุณสามารถแทนที่\0สิ่งที่อาจจะทำงานได้ง่ายขึ้นเล็กน้อยเช่นแท็บหรือบรรทัดใหม่ แต่จะปลอดภัยน้อยกว่าหากคุณมีชื่อไฟล์ที่ขี้ขลาด

หากคุณต้องการที่จะมีประสิทธิภาพมากขึ้นคุณสามารถไพพ์เอาต์พุตไปยังสคริปต์ที่จัดการกับมันในขณะที่มันรัน แต่นั่นจะทำงานได้อีกเล็กน้อยและคุณจะต้องทำให้ถูกต้องในครั้งแรก


0

ฉันทำมาแล้ว :) เจ้าไม่เร็ว แต่ใช้งานได้:

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

การเพิ่มความเร็วที่ยอดเยี่ยมจะเกิดขึ้นหากเราค้นหาเฉพาะ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.