这将为您提供文件系统中已删除文件占用空间的列表(仍处于打开状态):
find /proc/*/fd -ls 2>/dev/null | grep '(deleted)'
然而,文件描述符的管道文件名返回大小 0 :
find /proc/*/fd -ls 2>/dev/null | grep '(deleted)' \
| sed 's!.*\(/proc[^ ]*\).*!\1!' | xargs ls -lhas
由于它们仍然有内容,因此使用wc -c
提供了大小:
find /proc/*/fd -ls 2>/dev/null | grep '(deleted)' \
| sed 's!.*\(/proc[^ ]*\).*!\1!' | xargs wc -c | sort -nr |head -n 20
例子:
2809946696 total
2387677184 /proc/15050/fd/26
67108864 /proc/1626/fd/23
67108864 /proc/1059/fd/6
10485760 /proc/11417/fd/298
10485760 /proc/11417/fd/239
10485760 /proc/11417/fd/155
10485760 /proc/11366/fd/499
但是,是否有更好的方法(比wc -c
标记为 的文件描述符(deleted)
)来找出哪些文件占用最多空间? (或者更好的是,哪个进程占用最多空间来保持已删除文件的打开句柄?)
答案1
和zsh
,
ls -lLrS /proc/*/fd/*(-l0)
将按文件大小排序列出它们(例如wc -c
,所以不是磁盘使用情况)。
对于磁盘使用情况,您可以执行以下操作:
zmodload zsh/stat
bydu() zstat -A REPLY +block -- $REPLY
ls -lLsU /proc/*/fd/*(-l0no+bydu)
(假设GNUls
是为了-U
不排序)
对于每个进程的磁盘使用情况,您可以执行以下操作:
typeset -aU proc=(/proc/*/fd/*(-l0.:h:h:t))
for p ($proc) {du -Hksc /proc/$p/fd/*(-.l0) | sed -n "\$s/total\$/$p/p"} | sort -n
(此处以千字节为单位)