du与df查看已使用空间不一致的原因及解决办法

linux df -h 显示使用空间已满,用du -sh查看哪个文件夹占用空间比较大时显示只使用了26G,两者相差20GB+

问题展示

1
2
3
4
5
6
7
8
9
[root@ls-dj-test-4 /]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda1 100G 100G 20K 100% /

[root@ls-dj-test-4 /]# du -sh /

26G /

从这里面可以看出通过du看到使用了26G,但是通过df 看,/data目录已使用100G

问题原因

这种问题主要是因为已经被删掉的文件还有程序(进程)在占用,所以文件没被真正释放

解决办法

方案一

1、lsof |grep deleted > deleted_file查看有哪些未被释放的文件
2、排序看最大的未被释放的文件大小,命令:sort -nr -k 7 deleted_file>sort_deleted_file
3、more sort_deleted_file 查看前面那些文件,将占用空间大的程序kill掉
kill 进程号

方案二

有时候进程号太多,都是占用一个文件,那就需要新的解决方案了。

1
2
3
...
sh 7654 7723 sh root 46w REG 0,22 65536 276676 /var/log/54sdfa48df1sdag654dfg15.log (deleted)
...

这个时候找到对应进程号后,直接cd /proc/pid/fd(fd中记录的是这个进程打开的所有文件的信息),pid是进程号(自己前面的修改命令)。
这时候需要通过方法一lsof查找到被删除文件的信息,命令回显其中有一项是FD,这个值有最后一位去除(最后一位可能是w/r/u等表示文件状态),例如上述FD值为46w,则在fd路径下对应的文件是46,直接执行echo “” > 46,看下面命令,自己领悟。

1
2
3
4
5
6
7
8
9
10
11
$ pwd
/proc/7654/fd
$ ls
0 104 110 117 123 13 141 19 25 31 38 44 50 57 63 70 78 84 90 97
1 105 111 118 124 130 147 2 26 32 39 45 51 58 64 71 79 85 91 98
10 106 112 119 125 131 15 20 27 33 4 46 52 59 65 72 8 86 92 99
100 107 113 12 126 132 16 21 28 34 40 47 53 6 66 74 80 87 93
101 108 114 120 127 135 17 22 29 35 41 48 54 60 67 75 81 88 94
102 109 115 121 128 138 171 23 3 36 42 49 55 61 68 76 82 89 95
103 11 116 122 129 14 18 24 30 37 43 5 56 62 7 77 83 9 96
$ echo "" > 46

执行完毕后,再次通过df du命令查看时,问题应该解决了。

最后,其实这个问题重启就能解决。