分类: 系统运维
2015-04-29 22:32:38
直接来方法,如图
解释:
1.du 与 df 大小不一致
2.lsof 查找 有delete 标记的文件,并按大小排序
3.找到大文件的 PID fd
4.清空大文件
大家都知道正常清日志是用 >,而不是直接rm
原因很简单,就是因为系统在使用,即便你删除文件,fd 依旧指向同一个inode, 只是你删除了目录索引结点。为了让应用能正常运行,系统就不会释放那个用于写入的文件,依然存在磁盘之上。
原理是什么?
很简单,用exec 就可以实现。
Exec 可以指定一个用于写的文件,可以指定一个用于读的文件,可以跟踪文件位置(就是这个)
现在立即写一个(用于写):
[public@CNSZ040588 ~]$ exec 100>/tmp/ForWrite.txt
[public@CNSZ040588 ~]$ ls -l /proc/$$/fd
total 0
lrwx------ 1 public usr01 64 Apr 20 22:14 0 -> /dev/pts/11
lrwx------ 1 public usr01 64 Apr 20 22:14 1 -> /dev/pts/11
l-wx------ 1 public usr01 64 Apr 20 22:35 100 -> /tmp/ForWrite.txt
lrwx------ 1 public usr01 64 Apr 20 22:13 2 -> /dev/pts/11
lrwx------ 1 public usr01 64 Apr 20 22:14 255 -> /dev/pts/11
[public@CNSZ040588 ~]$ ls /tmp/ForWrite.txt
/tmp/ForWrite.txt
[public@CNSZ040588 ~]$ echo "Good" >&100
[public@CNSZ040588 ~]$ cat /tmp/ForWrite.txt
Good
[public@CNSZ040588 ~]$ exec 100<&-
[public@CNSZ040588 ~]$ ls /tmp/ForWrite.txt
/tmp/ForWrite.txt
[public@CNSZ040588 ~]$ ls /proc/$$/fd
0 1 2 255
|