按大小对已删除(但仍打开)的文件进行排序

按大小对已删除(但仍打开)的文件进行排序

这将为您提供文件系统中已删除文件占用空间的列表(仍处于打开状态):

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

(此处以千字节为单位)

相关内容