df -h查看磁盘空间不足,du -sh /*却没有找到大数据文件

发布时间 2023-10-08 17:04:12作者: Fire_Li
df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1       296G  199G   82G  71% /
tmpfs           7.8G     0  7.8G   0% /dev/shm

 

但是通过du -sh/* 查看7.7M    /bin
138M    /boot
214M    /data
160K    /dev
20K    /dump.rdb
46M    /etc
8.0K    /hbr
384K    /home
156K    /ip.txt
681M    /lib
23M    /lib64
16K    /lost+found
4.0K    /media
242M    /mnt
16K    /mobile
4.0K    /NULL
8.0K    /opt
0    /proc
247M    /root
16M    /sbin
4.0K    /selinux
4.0K    /srv
0    /sys
148M    /tmp
4.8G    /usr
849M    /var
68G    /workspace

很明显存在差异丢失了一百多G,这是因为

通过df -h命令查看的磁盘使用情况是文件系统级别的,而通过du -sh /*命令查看的是各个目录的磁盘使用情况。这两个命令之间的不匹配可能是由于某些文件被删除或移动导致的。

举个例子,假设在你的文件系统中有一个大文件被删除了,但该文件的文件句柄仍然被某个进程占用着,那么这个文件在磁盘上的空间就会一直被占用,但是du -sh /*命令不会显示它,因为它已经不在文件系统的目录结构中了。这种情况下,df -h显示的磁盘使用情况会比du -sh /*命令显示的磁盘使用情况更大。

通过lsof命令查看占用进程,因为输出结果特别多到出到文件观看

lsof > lsof_output.txt

 第四列是文件大小定位到这两行看到最后有个deleted这是已经删除但是还占用的

  1. 重新启动Java应用程序:如果可能的话,可以重新启动Java应用程序(java进程)。这将关闭现有的文件描述符,并创建一个新的catalina.out文件,其中包含新的数据。

  2. 重定向输出:如果不需要catalina.out中的输出,您可以将标准输出和标准错误输出重定向到/dev/null或其他文件,以阻止进一步的数据写入已删除的文件。例如,可以使用以下命令将这两个流重定向到/dev/null

    java -jar 应用程序.jar > /dev/null 2>&1 &
  3. 手动截断已删除的文件:如果想立即回收磁盘空间并且不希望重新启动应用程序,可以使用truncate命令手动截断已删除的catalina.out文件。但要谨慎使用此方法,因为它将删除文件中的现有数据。

    truncate -s 0 /workspace/service_DWR/apache-tomcat-7.0.69/logs/catalina.out
    df -h
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/vda1       296G   76G  205G  27% /
    tmpfs           7.8G     0  7.8G   0% /dev/shm

    恢复正常