首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

Linux服务器磁盘空间占用情况分析与清理指南

编程知识
2024年09月27日 07:00

为确保重大节日期间,团队负责的测试环境服务器磁盘不会占用过高,导致频繁报警。我们要求在重大节假日前对服务器磁盘占用情况进行检查。如果发现占用过高,则需人为介入,进行相应清理。

一、检查要求

查看各分区占用情况,如果达到以下任一条件,则需要人为介入判断或处理:

(1)磁盘使用率 > 90%

(2)磁盘使用 > 80% 且 剩余空间 < 30G

(3)磁盘使用 > 70% 且 剩余空间 < 50G

二、解决办法

使用 shell 脚本,统计并判断磁盘占用情况,如有异常,输出异常信息。

脚本代码如下:

#!/bin/bash

RED='\033[0;31m'
NC='\033[0m'

if [[ $1 == "detail" ]]
then
    df -BG
else
    IS_NORMAL=1
    while read line
    do
        if [[ ${line} == Filesystem* ]]; then
            continue
        fi

        filesystem=$(echo ${line} | awk '{print $1}')
        use_rate=$(echo ${line} | awk '{print $5}' | sed 's/%//g')
        avail_space=$(echo ${line} | awk '{print $4}' | sed 's/G//g')
        mounted_on=$(echo ${line} | awk '{print $6}')

        if [[ ${use_rate} -gt 90 ]] || [[ ${use_rate} -gt 80 && ${avail_space} -lt 30 ]] || [[ ${use_rate} -gt 70 && ${avail_space} -lt 50 ]]; then
            echo -e "${RED}WARN: Filesystem ${filesystem} mounted on ${mounted_on} has problem: use rate is ${use_rate}%, available space is ${avail_space}G.${NC}"
            IS_NORMAL=0
        fi
    done < <(df -BG) 

    if [[ ${IS_NORMAL} -eq 1 ]]; then
        echo "INFO: Disk space usage is normal."
    fi
fi

关键代码说明:

df -BG :命令用于报告文件系统的磁盘空间使用情况,-BG 选项表示以 G 字节为单位显示,B的含义为:use SIZE-byte blocks

建议脚本保存路径:/data/sh/general/disk_usage_check.sh

初始化脚本执行命令:mkdir -p /data/sh/general/;touch /data/sh/general/disk_usage_check.sh;chmod +x /data/sh/general/disk_usage_check.sh;vim /data/sh/general/disk_usage_check.sh

三、脚本使用方法

1)根据检查要求,判断磁盘空间占用是否存在占用过多的情况

执行脚本:/data/sh/general/disk_usage_check.sh

2)如由需要,可以进一步查看各分区磁盘占用信息

执行脚本:/data/sh/general/disk_usage_check.sh detail

使用示例,查看结果,分两种情况:

(1)检查正常

[root@localhost ~]# /data/sh/general/disk_usage_check.sh 
INFO: Disk space usage is normal.

(2)检查异常,查看需要人为介入判断及处理

[root@novalocal general]# /data/sh/general/disk_usage_check.sh 
WARN: Filesystem /dev/vdb mounted on /data has problem: use rate is 76%, available space is 47G.

[root@novalocal general]# /data/sh/general/disk_usage_check.sh detail
Filesystem              1G-blocks  Used Available Use% Mounted on
/dev/mapper/centos-root       49G   12G       38G  23% /
devtmpfs                       8G    0G        8G   0% /dev
tmpfs                          8G    1G        8G   1% /dev/shm
tmpfs                          8G    1G        7G  11% /run
tmpfs                          8G    0G        8G   0% /sys/fs/cgroup
/dev/vdb                     197G  142G       47G  76% /data
/dev/vda1                      1G    1G        1G  20% /boot
tmpfs                          2G    0G        2G   0% /run/user/0

处理方法可参考下一章节

四、占用定位与解决办法

1. 查看目录下各文给或文件夹大小,并降序输出

[root@f2 data]# du -sh * | sort -hr
27G tomcat
5.1G did-generator
4.1G register
2.5G turbine-web
1.4G rbmq-productor
1.1G consul
600M backup
544M test-backup
527M deploy

命令解析:

du: 是 "disk usage" 的缩写,这个命令用于估算文件或目录在磁盘上所占用的空间。

-s: 这个选项告诉 du 命令仅显示总计大小,而不列出每个子目录或文件的大小。

-h: 这个选项让 du 以易读的格式显示大小(例如,自动选择 KB、MB、GB 等单位)。

-r: 这个选项让 sort 命令以降序排列结果(默认是升序)。

2. 为什么删除被占用的文件,不能释放空间?

在 Linux 中,当你删除一个文件时,如果该文件仍被某个进程所使用(即有一个打开的文件描述符指向这个文件),那么这个文件的磁盘空间并不会被立即释放。这是因为在 Linux 中,文件的删除实际上是删除了文件名和 inode 的关联,而不是删除 inode 本身。只有当所有关联到该 inode 的文件描述符都被关闭后,该 inode 才会被删除,对应的磁盘空间才会被释放。

如果你删除了一个仍被进程使用的文件,你可以通过重启进程或者重启系统来确保所有的文件描述符都被关闭,从而释放磁盘空间。

可以使用 lsof 命令查看该类文件

(1)查看被删除但未释放的文件的命令:lsof | grep '(deleted)'

(2)查看占用空间最大的被删除但未释放的文件:lsof | grep '(deleted)' | sort -n -r -k 7,7 | head -n 10,命令解析:

-n:以数值进行排序。默认情况下,sort 命令会以字符串方式进行排序,但是 -n 选项会让 sort 命令以数值方式进行排序。

-r:以逆序方式进行排序。默认情况下,sort 命令会以升序方式进行排序,但是 -r 选项会让 sort 命令以降序方式进行排序。

-k 7,7:指定排序的字段。默认情况下,sort 命令会以整行作为排序的依据,但是 -k 选项可以让 sort 命令只以指定的字段作为排序的依据。在这里,-k 7,7 表示只以第7个字段作为排序的依据。

五、遇到问题

1. 管道模式执行时,无法更新变量值

  IS_NORMAL=1
  df -BG | while read line
  do
    IS_NORMAL=0  
  done

  echo ${IS_NORMAL} 

上述代码,最后输出 IS_NORMAL 值始终为 1,无法修改为 0,原因:

在 bash 脚本中,管道符|会创建一个子 shell 来执行管道符右侧的命令。在这个例子中,while read line 循环就在一个子 shell 中执行。因此,循环内部对变量 IS_NORMAL 的修改在子 shell 中发生,不会影响到主 shell 中的变量。

要解决这个问题,可以使用进程替代,将 while read line 循环作为主进程来执行。修改后代码如下:

  IS_NORMAL=1
  while read line
  do
    IS_NORMAL=0  
  done < <(df -BG) 

  echo ${IS_NORMAL} 

六、补充说明

1. du 和 df 的区别

dudf 都是 Linux 系统中的命令,用于检查磁盘空间使用情况,但他们的使用方式和显示的信息有所不同。

(1) du 命令:du 是 "disk usage" 的缩写,这个命令的主要作用是估算文件或者目录在磁盘中占用的空间大小。它会递归地对目录进行扫描,然后将每个子目录的大小都计算出来。

   举例:du -sh /home

这个命令会显示 /home 目录的总大小。-s 参数表示只显示总计,-h 参数表示以易读的格式显示大小(例如 K,M,G)。

(2)df 命令:df 是 "disk filesystem" 的缩写,这个命令的主要作用是显示磁盘的使用情况。它会显示所有已挂载的文件系统的磁盘空间使用情况,包括总空间、已使用的空间、剩余的空间以及使用的百分比。

   举例:df -h

这个命令会以易读的格式显示所有已挂载的文件系统的磁盘空间使用情况。-h 参数表示以易读的格式显示大小(例如 K,M,G)。

总的来说,dudf 的主要区别在于,du 是用来查看文件或目录的大小,而 df 是用来查看磁盘的使用情况。

From:https://www.cnblogs.com/zengzuo613/p/18434300
本文地址: http://www.shuzixingkong.net/article/2340
0评论
提交 加载更多评论
其他文章 【译】通过新的 WinUI 工作负荷和模板改进,深入原生 Windows 开发
我们创建了一个新的 Windows Dev Center 页面,简化了我们的 Getting Started with WinUI 文档,并与 Visual Studio 合作来改善开发人员在工作负荷和模板方面的体验。
【译】通过新的 WinUI 工作负荷和模板改进,深入原生 Windows 开发 【译】通过新的 WinUI 工作负荷和模板改进,深入原生 Windows 开发 【译】通过新的 WinUI 工作负荷和模板改进,深入原生 Windows 开发
一篇文章讲清楚synchronized关键字的作用及原理
概述 在应用Sychronized关键字时需要把握如下注意点: 一把锁只能同时被一个线程获取,没有获得锁的线程只能等待; 每个实例都对应有自己的一把锁(this),不同实例之间互不影响;例外:锁对象是*.class以及synchronized修饰的是static方法的时候,所有对象公用同一把锁 sy
一篇文章讲清楚synchronized关键字的作用及原理 一篇文章讲清楚synchronized关键字的作用及原理 一篇文章讲清楚synchronized关键字的作用及原理
Sql介绍 与 Sql基础查询
Sql介绍 与 Sql基础查询 SQL SQL也称为结构化查询语言(Structure Query Language),是一种用于管理和操作关系型数据库的标准化计算机语言,SQL语言广泛应用于各种关系型数据库系统(RDBMS)如Mysql,Oracle,Microsoft SQL Server等等
PasteForm最佳CRUD实践,实际案例PasteTemplate详解之管理前端的代码(二)
之前的文章说了,使用反射和ABPvNext的Dto实现用后端控制前端以实现最佳CRUD实践! 相信看过一的已经了解了这个PasteForm是如何实现的了,本文来看下具体如何实现的 表格页面的实现 打开pasteform/index.html页面之后,先会向API请求当前的path的数据模板 _api
救园倒计时:救园最后4天
救园目的:园子这三年困难阶段靠贷款维持,救园是为了还掉贷款,度过难关。救园方式: 终身会员计划,会员,捐助,周边。救园之后,一边增加收入来源,一边加快推进园子的商业化
救园倒计时:救园最后4天
《HelloGitHub》第 102 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Pytho
《HelloGitHub》第 102 期 《HelloGitHub》第 102 期 《HelloGitHub》第 102 期
排查maven 冲突及解决方式
Maven Maven 是一个以项目为中心的自动化构建工具,主要用于Java项目的管理和构建。它提供了一种统一的方式来描述项目的结构、依赖关系和构建过程,简化了项目的构建和管理。 Maven 的主要特点: 项目对象模型(POM):Maven 使用pom.xml文件来定义项目的依赖、插件和构建配置。P
排查maven  冲突及解决方式 排查maven  冲突及解决方式 排查maven  冲突及解决方式
从零开始学机器学习——准备和可视化数据
首先给大家介绍一个很好用的学习地址:https://cloudstudio.net/columns 数据准备-清洗 在进行机器学习的第一步——准备数据,为了方便起见,我已经提前下载好了所需的文件。 https://files.cnblogs.com/files/guoxiaoyu/US-pumpki
从零开始学机器学习——准备和可视化数据 从零开始学机器学习——准备和可视化数据 从零开始学机器学习——准备和可视化数据