一个监控未释放已删除文件空间的脚本

具体需求:

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"

  

原文地址:https://www.cnblogs.com/bill2014/p/8124292.html

时间: 2024-07-30 12:43:04

一个监控未释放已删除文件空间的脚本的相关文章

运维实战案例之文件已删除但空间不释放问题解析

1.错误现象 运维的监控系统发来通知,报告一台服务器空间满了,登陆服务器查看,根分区确实没有空间了,如下图所示: 这里首先说明一下服务器的一些删除策略,由于Linux没有回收站功能,我们的线上服务器所有要删除的文件都会首先移动到系统/tmp目录下,然后定期清除/tmp目录下的数据.这个策略本身没有问题,但是通过检查发现这台服务器的系统分区中并没有单独划分/tmp分区,这样/tmp下的数据其实是占用了根分区的空间.既然找到了问题,那么删除/tmp目录下一些大数据即可,执行如下命令,检查/tmp下最

关于mysql 删除数据后物理空间未释放

OPTIMIZE TABLE 当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小.这是因为删除操作后在数据文件中留下碎片所致.OPTIMIZE TABLE 是指对表进行优化.如果已经删除了表的一大部分数据,或者如果已经对含有可变长度行的表(含有 VARCHAR . BLOB 或 TEXT 列的表)进行了很多更改,就应该使用 OPTIMIZE TABLE 命令来进行表优化.这个命令可以将表中的空间碎片进行合并,并且可以消除由于删除或者更新造成的空间浪费 .OPTIMIZE TABLE

RHEL6删除文件后未释放空间

早上一个网站页面打开空白,后来查看是磁盘空间满了,查看是nginx的access.log占用了170多个G,于是通过rm将其删除,后重启nginx问题依然,此时再查看磁盘发现空间并未释放 [[email protected] logs]# du -h * 176G access.log 0 error.log 4.0K nginx.pid [[email protected] logs]# du -sh  176G . [[email protected] logs]# rm access.lo

关于mysql 删除数据后物理空间未释放(转载)

转自 关于mysql 删除数据后物理空间未释放(转载) - NETDATA - 博客园http://www.cnblogs.com/shawnloong/archive/2013/02/07/2908911.html OPTIMIZE TABLE 当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小.这是因为删除操作后在数据文件中留下碎片所致.OPTIMIZE TABLE 是指对表进行优化.如果已经删除了表的一大部分数据,或者如果已经对含有可变长度行的表(含有 VARCHAR . B

Linux中删除文件,磁盘空间未释放问题追踪

在客户使用我们产品后,发现一个问题:在删除了文件后,磁盘空间却没有释放.是有进程在打开这个文件,还是其他情况?我们一起来看看一下两个场景 一. 场景一:进程打开此文件 当一个文件正在被一个进程使用时,用户删除此文件,文件只会从目录结构中删除,但并没有从磁盘删除.当使用这个文件的进程结束后,文件才会真正的从磁盘删除,释放占有的空间. 我们发现剩余磁盘空间比较少时,回去删除一些大的临时文件或者log文件,如果删除之后会发现磁盘空间并未减少,那么可以通过"lsof"命令去查看正在使用该文件的

mysql优化, 删除数据后物理空间未释放(转载)

OPTIMIZE TABLE 当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小.这是因为删除操作后在数据文件中留下碎片所致.OPTIMIZE TABLE 是指对表进行优化.如果已经删除了表的一大部分数据,或者如果已经对含有可变长度行的表(含有 VARCHAR . BLOB 或 TEXT 列的表)进行了很多更改,就应该使用 OPTIMIZE TABLE 命令来进行表优化.这个命令可以将表中的空间碎片进行合并,并且可以消除由于删除或者更新造成的空间浪费 .OPTIMIZE TABLE

同一个事务里 查询 已删除但是未提交的数据[bug记录]

前几天犯了个低级错误,在一个事务方法里老是查询不到某条记录,但是debug卡住时,用db工具查,又能查出值. 经过一番折腾,原来是我在同一个事务里 查询 了已删除但是未提交的数据,当然查询不到了!!! 情况是这样的: Service层(spring事务管理配置在这一层,此方法配了PROPAGATION_REQUIRED)有个方法function m()写得很长, 其中有2步是 1. delete from B where objectid ='TestB' 2. select * from A

关于mysql 删除数据后(.MYD,MYI)物理空间未释放

关于mysql 删除数据后物理空间未释放 OPTIMIZE TABLE 当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小.这是因为删除操作后在数据文件中留下碎片所致.OPTIMIZE TABLE 是指对表进行优化.如果已经删除了表的一大部分数据,或者如果已经对含有可变长度行的表(含有 VARCHAR . BLOB 或 TEXT 列的表)进行了很多更改,就应该使用 OPTIMIZE TABLE 命令来进行表优化.这个命令可以将表中的空间碎片进行合并,并且可以消除由于删除或者更新造成

C++内存未释放的情况

以下例子中,存储了整数123的记亿体空间不能被删除,因为地址丢失了.这些空间已无法再使用. 1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 int *a = new int(123); 6 cout << *a << endl; 7 // We should write "delete a;" here 8 a = new int(456); 9 cout <<