Linux磁盘空间100% 查找并删除大文件 Linux 磁盘满

发现问题
如果是数据库,在客户端操作(比如 navicat)数据库的时候,会弹窗报错 No space left on device,java 应用也会在日志里报这个错;
如果是 spring-boot spring-cloud,eureka 状态会显示 DOWN;
其他应用程序应该也会出现不同的 down,比如连不上、响应速度非常慢等等。
问题验证
直接使用 df 命令查看磁盘占用情况:

df -h
#output>>>>>>>>>>>>>>>>
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_192-lv_root 50G 44G 3.4G 100% /
#output>>>>>>>>>>>>>>>>

发现是真的,解决办法有两种:

扩容,可以参考这里:Linux 磁盘扩容
查找大文件,确认是什么原因导致磁盘被占满,要么更改一些策略,比如 kafka 日志清理策略、CDH 集群健康日志清理策略等,要么删除大文件。
这里记录查找并删除大文件。

查找大文件
使用 du 和 df 命令定位大文件:

# 先确定是哪个文件夹占用较多
# 如果文件较多命令执行可能很慢,在知道大概位置的情况下不建议直接对根目录操作
# du 的–max-depth=1 表示只展示第一个层级的目录和文件
# sort 的-h 选项和 du 的-h 选项一个意思,-r 表示倒叙,默认升序
du -h / –max-depth=1 | sort -hr | head -n 10
#output>>>>>>>>>>>>>>>>>>>>>>>>>>
50G /
28G /var
6.0G /dfs
4.0G /opt
3.0G /root
2.3G /usr
148M /lib
39M /log
30M /etc
29M /boot
#output>>>>>>>>>>>>>>>>>>>>>>>>>>

# 定位到/var 目录占用超过 50%(磁盘总量 50G)
# 继续往下层目录找
du -h /var –max-depth=1 | sort -hr | head -n 10
#output>>>>>>>>>>>>>>>>>>>>>>>>>>
28G /var
24G /var/lib
3.8G /var/log
371M /var/cache

#output>>>>>>>>>>>>>>>>>>>>>>>>>>

# 继续/var/lib
du -h /var/lib –max-depth=1 | sort -hr | head -n 10
#output>>>>>>>>>>>>>>>>>>>>>>>>>>
24G /var/lib
10G /var/lib/mongo
8.4G /var/lib/cloudera-service-monitor
4.5G /var/lib/cloudera-host-monitor
319M /var/lib/mysql

#output>>>>>>>>>>>>>>>>>>>>>>>>>>

# 最后发现是 mongo 数据量太多以及 cdh 集群健康数据太多
# 可以设置 mongo journal 使用 smallfile,否则文件到达 1G 并且文件所记载的写操作都被使用过了才会删除
# cdh 日志默认在文件达到 10G 的时候才会回滚,这里也可以做文章

删除大文件
假设找到了对应的文件夹或文件并且可以删除,可以直接使用 rm删除,也可以按照时间删除,比如一些日志文件,需要删除靠前的日志,较新的日志暂时还不能删除。

按文件大小删除
比如需要删除超过 500M 的文件,而不是删除整个文件夹:

# 建一个临时文件夹做测试
cd /tmp
mkdir test
cd test

# 建几个大文件试试
# seek 表示跳过文件中指定大小的部分,实际上并没有写入任何数据
# 生成 1000G 的文件
dd if=/dev/zero of=test-big1 bs=1G count=0 seek=1000
# 生成 1000M 的文件
dd if=/dev/zero of=test-big2 bs=1M count=0 seek=1000

#查找 -size 参数值中+表示> -表示< 不写表示等于
find /tmp/test -type f -size +200M
#output>>>>>>>>>>>>>>>
/tmp/test/test-big2
/tmp/test/test-big1
#output>>>>>>>>>>>>>>>

find /tmp/test -type f -size +2000M
#output>>>>>>>>>>>>>>>
/tmp/test/test-big1
#output>>>>>>>>>>>>>>>

find /tmp/test -type f -size -2000M
#output>>>>>>>>>>>>>>>
/tmp/test/test-big2
#output>>>>>>>>>>>>>>>

# 删除
# {} \;不能丢
find /tmp/test -type f -size +2000M -exec rm -rf {} \;
ls
#output>>>>>>>>>>>>>>>
test-big2
#output>>>>>>>>>>>>>>>

按时间和名称删除

# 删除修改时间距今超过 10 天的以.gz 结尾的文件
# -mtime 参数值中 0 表示修改时间在 24 小时内 +x 表示修改时间距今超过 x 天 -x 表示距今少于 x 天 不写正负号表示等于
find tmp/test/* -mtime +10 -name “*.gz” -exec rm -rf {} \;

相关文章

发表新评论