星期一, 四月 16, 2007

df 和 du 输出不符 -- lsof +L1

在删除了大日志文件后,使用 df 发现分区快用尽了,但用 du 统计的结果却发现没有使用多少分区。这是因为文件虽然被删除了,但运行中的进程却仍然 link 到它们,所以磁盘空间实际上并没有释放。

可以使用 lsof +L1 来查看所有这样的文件。类似下面的输出:
COMMAND   PID  USER   FD   TYPE DEVICE SIZE NLINK   NODE NAME
httpd 10944 root 42u REG 253,0 0 0 491543 /tmp/ZCUD6duOXq (deleted)
httpd 11381 httpd 42u REG 253,0 0 0 491543 /tmp/ZCUD6duOXq (deleted)
httpd 11382 httpd 42u REG 253,0 0 0 491543 /tmp/ZCUD6duOXq (deleted)
httpd 11383 httpd 42u REG 253,0 0 0 491543 /tmp/ZCUD6duOXq (deleted)
httpd 11384 httpd 42u REG 253,0 0 0 491543 /tmp/ZCUD6duOXq (deleted)
...
这里只是一个小文件,实际可能是一个很大的文件。+L1 标识 link counts 的上限为 1,所以就是 0。

如果重启服务不行,那就 kill 掉这些进程:
sh# lsof +L1 | awk '{print $2}' | sed -n '2,$p' | uniq | xargs kill
所以最好还是先更改 httpd.conf 的 log 配置,重启 Apache 之后再移除旧日志。

参考:
http://www.prefetch.net/blog/index.php/2006/01/10/where-is-my-space/

没有评论: