具体需求:
1、 需要分析出是视频/data分区个类文件占比(实际文件占比多少,一般实际文件小于占比70%以下大多为已删除文件单未释放磁盘空间)。
2、 需要统计已删除文件但未释放空间的大小(可参考lsof命令)。
3、 根据1和2最终分析结果拿出占比较大的服务列表(针对服务列表建议支持白名单),针对服务列表对已在摆明单内的服务进行重启释放存储空间,未在白名单内的可进行列表打印。
#!/usr/bin/python
#coding:utf-8
import os
import subprocess
import types
#文件占比
data_top10 = "du -sk /* |sort -n -t ' ' -k 1"
#已删除未释放
data_used = "lsof |grep delete|awk -F ' ' '{print $1,$8}'"
#目前占比
data_now = " df -h |grep /dev/vda1 |awk -F ' ' '{print $5}'|awk -F '%' '{print $1}'"
def subprocess_caller(cmd):
try:
p = subprocess.Popen(cmd, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = True)
output, error = p.communicate()
except OSError, e:
print 'SUBPROCEEE_CALLER function: execute command failed, message is %s' % e
return dict(output = [], error = [], code = 1)
else:
return dict(output = output, error = error, code = 0)
gele = {}
used = {}
dic = {}
#lsof查看没有释放的文件
def lsof_look():
#获得字符串将其转换成列表
temp2 = []
str2 = ''
for memeda in used['output']:
if memeda !=' ' and memeda !='\n':
str2 += memeda
else:
temp2.append(str2)
str2 = ''
#print len(temp2)
#lsof的列表,列表的拆分
list3 = []
list4 = []
for i in range(len(temp2)):
if i%2 == 0:
list3.append(temp2[i])
else:
list4.append(temp2[i])
#为了解决最后一个不能匹配的问题
list3.append('test')
list4.append('0')
#解决统计服务与大小的问题
list5 = []
summ = 0
for i in range(len(list3)-1):
if list3[i] == list3[i+1]:
summ += float(list4[i])/1024
#print summ
else:
summ += float(list4[i])/1024
if dic.has_key(list3[i]):
dic[list3[i]] += summ
else:
dic[list3[i]] = summ
summ = 0
for key in dic:
print '服务:'+key,'所占的空间为(kb):',(dic[key])
#分析十个使用量最高的目录与文件情况
def filerate():
#将字符串转成列表
temp = []
str = ''
f_dict = {}
for memeda in gele['output']:
if memeda != '\t' and memeda != '\n':
str += memeda
else:
temp.append(str)
str = ''
#将两个列表合成字典
list1=[]
list2=[]
for i in range(len(temp)):
if i % 2 == 0:
# if "K" in temp[i]:
temp[i]=float(temp[i])
# elif 'M' in temp[i]:
#temp[i]=float(temp[i].strip('M'))*1024
# else:
#temp[i]=float(temp[i].strip('G'))*1024*1024
list1.append(temp[i])
else:
list2.append(temp[i])
f_dict = dict(zip(list2,list1))
sss = 0
for key in f_dict:
t = f_dict[key]/41943040.0*100
sss += t
print '目录:'+key,'所占实际百分比为:%.2f%%' % (t)
print '=================总占实际比为:%.2f%%'%(sss)
#print sss
return sss
if __name__ == '__main__':
# 各类文件的使用大小情况
gele = subprocess_caller(data_top10)
#print gele["output"]
used = subprocess_caller(data_used)
#print used['output']
#df -h 所显示的磁盘占比,这个不是正常的,将其转化为70%的状态
now = subprocess_caller(data_now)
now_dick_used = float(now['output'])*0.7
#print now_dick_used
k = filerate()
print("\n")
lsof_look()
print("\n")
#不可删除的服务名单
immobilization_list = ['mylala','apache']
flag = 0
#获取服务字典里面的键值
key = dic.keys()
if k<now_dick_used:
for the_key in key:
if the_key in immobilization_list:
continue
else:
#cmd = "killall " + the_key
#os.system(cmd)
print "\033[1;35m已经杀死该服务:\033[0m",the_key
flag = 1
if flag == 0:
print "\033[1;35m系统状态正常!\033[0m"