我收到本地磁盘已满的警报;
dm@fooserv:/local/data/plog $ df -l
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/rootvg-datavol
121790564 115659468 0 100% /local/data
tmpfs 102400 1028 101372 2% /var/asagent/lib/asagen
我检查了目录并看到了该文件。
user@fooserv:/local/data/plog $ ls -ltr
total 84926904
lrwxrwxrwx 1 user ers_gsd 37 Aug 15 03:00 bomb.log -> /local/data/plog/bomb.31655.log
-rw-rw-rw- 1 user ers_gsd 0 Aug 15 03:00 recovery.log
drwxrwxrwt 2 user ers_gsd 4096 Aug 15 03:00 log/
-rw-rw-rw- 1 user ers_gsd 0 Aug 15 03:00 dropping.log
-rw-rw-rw- 1 user ers_gsd 10109 Aug 15 09:20 proc_fooserv.log
-rw-rw-rw- 1 user ers_gsd 381083 Aug 15 10:25 trip_bomb.rip.1.log
-rw-rw-rw- 1 user ers_gsd 60563456 Aug 15 13:35 bomb.31655.log
-rw-rw-rw- 1 user ers_gsd 0 Aug 15 13:37 bomb.stats
-rw-rw-rw- 1 user ers_gsd 86819237888 Aug 15 13:37 process-one.log
我发现了创建这些文件的进程并将其终止:
user@fooserv:/local/data/plog $ ps -ef | grep 12077
user 12077 1 0 09:20 ? 00:00:00 /bin/bash /home/user/bin/process_big.sh /local/data/plog/process-one.log
user 12085 12077 0 09:20 ? 00:00:35 tail -f /local/data/plog/process-one.log
user 12088 12077 0 09:20 ? 00:01:31 grep ERR
user 12095 12077 0 09:20 ? 00:02:06 grep -v FIXME
user 12098 12077 61 09:20 ? 02:38:56 /bin/bash /home/user/bin/process_big.sh /local/data/plog/process-one.log
user 22836 32756 0 13:36 pts/0 00:00:00 grep 12077
user@fooserv:/local/data/plog $ kill 12098
user@fooserv:/local/data/plog $ kill 12100
我删除了该文件:
用户@fooserv:/local/data/plog $ rm process-one.log
df 仍然说目录已满:
dm@fooserv:/local/data/plog $ df -l
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/rootvg-datavol
121790564 115659468 0 100% /local/data
tmpfs 102400 1028 101372 2% /var/asagent/lib/asagent
user@fooserv:/local/data/plog $
~
答案1
尝试检查导致文件资源被保留的进程是否仍在运行。
lsof -nP | grep '(deleted)'
应该给你一个起点。
答案2
您确定您终止了正确的进程吗?看起来该12077
进程是打开/创建/保存相关文件的进程。
答案3
Hymie 可能是对的 - 要么你杀死了错误的进程,要么有多个进程打开了该文件。删除文件会从目录表中删除 inode,但直到每个使用该文件的进程都关闭它时,空间才会被释放。它本身并没有被锁定,但在回收空间之前,有一个计数器需要为零。
尝试 lsof。由于您已经删除了该文件,请查看目录中打开了什么:
$ lsof +D /本地/数据/plog
或者使用 lsof 的其他咒语之一:http://www.thegeekstuff.com/2012/08/lsof-command-examples/
答案4
我在这里找到了很好的解释:
https://access.redhat.com/solutions/2316
正如 R J 的回答,lsof | grep deleted
这很有帮助。一旦我确定了主要问题(即数十 GB 的文件),我就使用echo > /proc/pid/fd/fd_number
,其中 pid 和 fd 的标识如上面的链接所示。
它将需要 sudo。此外,重新启动也有帮助。
链接的建议特别有用,因为我们有不重新启动机器的限制。