当服务器上的大文件被删除时,这些文件可能仍被进程引用,因此文件系统没有更多的可用空间。
我尝试使用lsof,但似乎它没有列出已删除的文件。fuser -c
做得更好,但进程列表太长,无法检查每个进程,特别是因为每个进程都是一个 Oracle 进程。
bash-3.2# fuser -c /var
/var: 105o 29999o 20444c 3528c 27258o 7715o 3864o 3862o 2494o 18205o 17450co 17445co 14912co 14824co 14818co 14816o 14814o 8532c 8530c 7633com 7118o 6958o 6790c 6784co 6734o 6693o 6689o 6684o 6675o 6635o 6594c 6548o 6547o 6546o 6545o 6544o 6543o 6542o 6541o 6540o 6537o 6535o 6456o 6128co 6113o 335o 245co 229o 161o 8o
bash-3.2# du -hs /proc
139T /proc
有时会发生这样的情况,即应用程序或用户删除了一个文件,例如日志文件,并且该文件仍然被无法重新启动的进程引用。
是否有好的方法来回收已删除文件的磁盘空间,而无需重新启动引用该已删除文件的进程?
答案1
find /proc/*/fd -ls 2> /dev/null | grep '(deleted)'
查找所有打开的文件描述符。
Grep 已删除。
StdError 到 /dev/null
输出:
160448715 0 lrwx------ 1 user user 64 Nov 29 15:34 /proc/28680/fd/113 -> /tmp/vteT3FWPX\ (deleted)
或者你可以使用awk
查找 /proc/*/fd -ls 2> /dev/null | awk'/deleted/ {print $11}';
awk 输出(在 bash Ubuntu 12.04 中测试):
/proc/28680/fd/113
查找并截断所有已删除的文件(在 bash Ubuntu 12.04 中测试):
(如果你不知道自己在做什么,请不要这样做)
find /proc/*/fd -ls 2> /dev/null | awk '/deleted/ {print $11}' | xargs -p -n 1 truncate -s 0
-p执行前提示截短
更好的方法是手动截断
手动截断:
: > /proc/28680/fd/113
或者:
> /proc/28680/fd/113
或者:
truncate -s 0 /proc/28680/fd/113
享受 ;)
答案2
这是一个简单的例子less
:
假设我们有一个文件my10MBfile
:
$ dd if=/dev/zero of=/tmp/my10MBfile bs=1M count=10
10+0 enregistrements lus
10+0 enregistrements écrits
10485760 octets (10 MB) copiés, 0,0454491 s, 231 MB/s
$ ls -l /tmp/my10MBfile
-rw-r--r-- 1 max max 10485760 avril 23 22:49 /tmp/my10MBfile
$ df -m /tmp
/dev/disk/by-uuid/6835b2fd-971d-420c-ba18-3c729ec2e8a0 14637 9225 4662 67% /
现在我用以下命令打开该文件less
(是的,它是一个二进制文件......没关系)
$ less /tmp/my10MBfile &
$ lsof -p $(pidof less) | grep 10MBfile
less 29351 max 4r REG 8,3 10485760 521464 /tmp/my10MBfile
然后我删除该文件
$ rm /tmp/my10MBfile
$ lsof -p $(pidof less) | grep 10MBfile
less 29351 max 4r REG 8,3 10485760 521464 /tmp/my10MBfile (deleted)
$ df -m /tmp
/dev/disk/by-uuid/6835b2fd-971d-420c-ba18-3c729ec2e8a0 14637 9225 4662 67% /
它仍然存在,但已被删除。查看 lsof 输出的第 4 列:文件描述符编号 4 打开以进行读取 (4r)
让我们运行 GDB!
$ gdb -p $(pidof less)
GNU gdb (GDB) 7.4.1-debian
....
Attaching to process 29351
....
(gdb) p close(4)
$1 = 0
(gdb) q
就是这样!
$ df -m /tmp
/dev/disk/by-uuid/6835b2fd-971d-420c-ba18-3c729ec2e8a0 14637 9215 4672 67% /
欢迎我们的 10 MB 回来:)
$ ls /proc/29351/fd
0 1 2 3
$ ps 29351
29351 pts/0 S+ 0:00 less /tmp/my10MBfile
该进程仍在运行。
答案3
此命令将显示 Solaris 系统上仍打开的所有已删除的文件:
find /proc/*/fd -type f -links 0
您可以用以下命令截断您确定想要的那些:
:> /proc/p/fd/x
其中 p 是进程 id,x 是第一个命令返回的文件描述符。
不要担心,如果某些程序报告的大小ls
在一段时间后恢复到截断之前的大小,由于文件现在是稀疏的,因此磁盘上实际使用的大小将小得多。
答案4
这些解决方案对我都不起作用。只有在以 root 身份使用 Bleachbit 后,我才能正确释放与已删除文件相关的空间。