• 正文
  • 相关推荐
申请入驻 产业图谱

Linux查找大文件、大目录 - 解决磁盘空间不足的问题

01/24 15:09
1473
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

【前言】

笔者最近有服务器突然停服务了,我登录服务器吓了一跳,下一面我们一起回顾一这个惊心动魄故事吧。

首先,使用ssh远程登录服务器,请出df大神看看硬盘的使用情况吧

df

Linux df(英文全拼:disk free) 命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计。

一般/dev/vda1为系统盘,像vdb、vdc为数据盘。

我们发现df输出的格式没有单位,可读性太低了。使用-h参数可解决。

-h或–human-readable 以K,M,G为单位,提高信息的可读性。

我的妈啊,所以居然/dev/vda1为系统盘100%, 还好能ssh登录服务器,只是http,mysql,java应用服务崩溃了。

是哪个目录或文件太小了,导致呢?我想到可能是队友java应用打印的日志,但他布哪个目录,我不清楚。我们有应用服务一般在/www/wwwroot, 所以我先定位在此目录。然后请出du命令

du

Linux du (英文全拼:disk usage)命令用于显示目录或文件的大小。先看看du

-h:以人类可读的方式显示
-a:显示目录占用的磁盘空间大小,还要显示其下目录和文件占用磁盘空间的大小
-s:显示目录占用的磁盘空间大小,不要显示其下子目录和文件占用的磁盘空间大小
-c:显示几个目录或文件占用的磁盘空间大小,还要统计它们的总和
--apparent-size:显示目录或文件自身的大小
-l :统计硬链接占用磁盘空间的大小
-L:统计符号链接所指向的文件占用的磁盘空间大小
du -h:这个就不多说了。

du -h

从输出可以看出du是显示所有目录和子目录所占用的磁盘空间。输出内容太多太乱了,不方便排查。

可以用下面的参数

–max-depth=<目录层数>

使用--max-depth=<目录层数> 超过指定层数的目录后,就方面排除了。

比如最多显示1层

du -h --max-depth=1

17M     ./iot

38M     ./omj

2.2M    ./TIOTSmartSpeaker

183M    ./fzd

116M    ./nodeServer

1.5G    ./apache-cassandra-3.0.28

4.0K    ./live

18M     ./project

2.0G    ./wss

512K    ./sql

23G     ./manager

12M     ./bi_n

80M     ./bi

212M    ./omj588

106M    ./kafka_2.12-3.4.0

28G     .

显示多了不方便查看,太乱多,如果再多点,还很难查到,哪个目录或文件大,就要用到排序, 请出sort命令。

sort

使用sort命令即可排序。

使用|来分隔不同的命令。

下面说下本文会用到的sort参数:

-r(--reverse) 以相反的顺序来排序

-h( --human-numeric-sort):使用易读性数字(例如:2K、1G),默认从小到大排序

-s -s或–summarize 仅显示总计。只显示指定目录或当前目录的大小。

我们只显示一层目录大小并排序,就能很多找出最大的目录或文件。

du -ah --max-depth=1  | sort -hr

28G     .

23G     ./manage

r2.0G    ./wss

1.5G    ./apache-cassandra-3.0.28

212M    ./omj588

183M    ./fzd

171M    ./root@172.24.132.110

171M    ./jdk-8u231-linux-x64.rpm

132M    ./event-0.0.1-SNAPSHOT.jar

116M    ./nodeServer

106M    ./kafka_2.12-3.4.0

102M    ./kafka_2.12-3.4.0.tgz

80M     ./bi

58M     ./0414_2.log

38M     ./omj

29M     ./0414.log

18M     ./project17M     ./iot

16M     ./tmp.tar.gz

12M ./bi_n

11M ./3.4.0.tar.gz

8.2M ./06.log

2.2M ./TIOTSmartSpeaker

512K ./sql

16K ./history.sql

4.0K ./live

4.0K ./extern_device.sql

这里我们很快知道了哪个目录占用空间大,直接进入目录manager

查看一下,发现有一个日志文件,太吓人了

不知队友是怎么想的,这么的日志文件,怎么查看呢。打印的是一些什么呢?看日志命名应该是9月20日启动的服务,才过去几天啊,就打印了那么多日志,云服务器很贵的,不能这样玩啊, 而且这个日志文件,根本没法看啊。

争得队友同事,把此文件删除。

下面命令:

rm -f 0920.log

占用硬盘空间仍然

再df -h看一下,占用有硬盘空间依然。怎么回事呢?

虽然删除了那个文件,但是服务一直占用那个文件,必须要重启占用应用服务。是哪个服务,我也不知道。

用下面看看是哪个程序在写0920.log

lsof -n | grep 0920.log

只知道是java应用在写0920.log,具体服务还是不清楚。

问题临时解决

用history看看执行过什么命令,果然被我查到了。

如果history没找到,可以看看开机启动, 用下面命令:cat /etc/rc.local 和ls /etc/init.d

重启java服务后, 硬盘空间,就释放了。

但这个方法,治标不治本,过几天,还是被日志撑满服务器。还是让队友改代码吧。

总结

应用程序打印日志无可说的, 但这样打印日志,不可取的。各位看官你们说呢?

相关推荐