• Linux系统批量释放deleted文件占用的空间


    一、问题描述

    现场某业务系统迁移到新的资源池后,后端java程序不定时遇到程序所在磁盘被占满的情况,实际有效数据并没有那么大,磁盘200G,有效数据只有42G,但磁盘使用率会报道98%,触发文件使用率告警。

    在这里插入图片描述

    二、原因及处理

    上述造成文件系统被占满的原因就是,该业务下的临时目录temp下存储临时上传文件,该文件被删除后显示deleted状态,但只要程序运行,该文件所占空间并不会得到释放,日积月累,导致文件系统被爆。
    在这里插入图片描述

    处理措施如下所示:

    1)手动处理

    最简单的就是kill掉服务进程,然后重启,相关文件释放后,文件系统空间也就被释放;

    2)手动释放

    如果lsof检查deleted标记的文件较少,占用空间较少,可参照如下进行手动删除。云享运维知识库,欢迎关注。

    1、通过lsof | grep deleted 找到未能删除掉的文件,确定占用的进程号;
    2、通过 ls -l /proc/PID/fd/* | grep 文件名,找到相应文件句柄;
    3、清除文件内容 echo > /proc/PID/fd/FD_NUM
    
    • 1
    • 2
    • 3

    3)脚本里处理释放

    脚本测试效果如下,从图中看可有效获取进程所在的文件描述符:
    在这里插入图片描述

    vim /usr/local/free_deleted.sh 
    
    • 1
    #!/bin/bash
    time=$(date "+%Y-%m-%d")
    spms_PID=$(ps -ef | grep spms | grep -v grep | awk '{ print $2 }')
    disk_used=`df -hT|grep spms|awk '{print $6}'|cut -d '%' -f1`
    deleted_fd=(`find /proc/*/fd -ls | grep '(deleted)'|awk '{print $11}'|cut -d '/' -f5`)
    
    if [ $disk_used -gt 90 ];then
       echo Now $time spms disk used more than 90%
       for i in ${deleted_fd[@]}
       do
         #echo "/proc/$spms_PID/$i"
         echo > /proc/$spms_
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    经典论文《Efficient Estimation of Word Representations in Vector Space》学习笔记
    02-MySQL-基础-增删改查
    rust 全局变量
    JavaScript 日常开发的 9 个实用代码片段 (part 1)
    【Elasticsearch】es脚本编程使用详解
    Mapbox 与 Babylon.js 可视化 构建车子
    go学习-GMP模型
    Python数据结构——基础数据结构
    linux文件权限与目录配置
    Spring Security是什么?(一)
  • 原文地址:https://blog.csdn.net/ximenjianxue/article/details/126895750