Disk Usage Summary per User and Time
If you are a system administrator, you often face disk utilisation dilemma. On one hand, you need to clean up those old and unwanted files. On the other hand, you cannot do so because they are owned by other users and you need their permission.
Below script summarise users' disk utilisation over certain duration. Hopefully this can help user to determine when they need to housekeep.
# cat b.py
#! /usr/bin/python
import fileinput, time, re
fmt="%-15s %8s %8s %8s %8s %8s %8s %8s %8s"
def print_line():
print fmt % ('-'*15,'-'*8,'-'*8,'-'*8,'-'*8,'-'*8,'-'*8,'-'*8, '-'*8)
def print_header():
print fmt % ('User','0-1m','1m-3m','3m-6m','6m-1y','1y-2y','2y-3y','3y- ', 'Total')
def print_footer():
print '\nNote: Size in GB'
# match directory, link, file
p=re.compile("^[ ]*[1-9][0-9]* [dl-]")
now=int(time.time())
y0m0=0
y0m1=1*30*86400
y0m3=3*30*86400
y0m6=6*30*86400
y1m0=1*365*86400
y2m0=2*365*86400
y3m0=3*365*86400
yxm0=100*365*86400
tranges=(
[y0m0, y0m1],
[y0m1, y0m3],
[y0m3, y0m6],
[y0m6, y1m0],
[y1m0, y2m0],
[y2m0, y3m0],
[y3m0, yxm0]
)
users=set()
summary=dict()
total_time=dict()
total_user=dict()
for line in fileinput.input():
if p.match(line):
(block, perm, link, user, group, size, epoch, others)=line.split(None,7)
iblock=int(block)
dt=now-int(epoch)
users.add(user)
# summary per user+duration
cnt=0
for (t1,t2) in tranges:
if t1<=dt and dt<t2:
key=(user,cnt)
if key in summary:
summary[key]+=iblock
else:
summary[key]=iblock
# total per duration
if cnt in total_time:
total_time[cnt]+=iblock
else:
total_time[cnt]=iblock
cnt+=1
# total per user
if user in total_user:
total_user[user]+=iblock
else:
total_user[user]=iblock
allusers=list(users)
allusers.sort()
factor=1024.0*1024.0
print_header()
print_line()
for user in allusers:
print "%-15s" % user,
for cnt in range(len(tranges)):
key=(user,cnt)
if key in summary:
gb=summary[key]/factor
else:
gb=0.0
print "%8.2lf" % gb,
# user total
gb=total_user[user]/factor
print "%8.2lf" % gb
print_line()
print "%15s" % "Total:",
total=0.0
for cnt in range(len(tranges)):
if cnt in total_time:
gb=total_time[cnt]/factor
else:
gb=0.0
print "%8.2lf" % gb,
total+=gb
print "%8.2lf" % total
print_footer()
Here is a sample output from my 16GB SSD netbook
# ls -lRs --time-style=+%s /var | ./b.py
User 0-1m 1m-3m 3m-6m 6m-1y 1y-2y 2y-3y 3y- Total
--------------- -------- -------- -------- -------- -------- -------- -------- --------
avahi-autoipd 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
chihung 0.00 0.00 0.00 0.41 0.00 0.00 0.00 0.41
colord 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
daemon 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
libuuid 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
lightdm 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
lp 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
man 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
mysql 0.03 0.00 0.00 0.00 0.00 0.00 0.00 0.03
root 0.21 0.07 0.04 0.02 0.00 0.00 0.00 0.35
speech-dispatcher 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
syslog 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
www-data 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
--------------- -------- -------- -------- -------- -------- -------- -------- --------
Total: 0.24 0.07 0.04 0.43 0.00 0.00 0.00 0.79
Note: Size in GB


0 Comments:
Post a Comment
<< Home