これにより、(まだ開いている)スペースを占有しているファイルシステム内の削除されたファイルのリストが表示されます。
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)
よりも)どのファイルが最もスペースを占めているかを見つけるためのより良い方法はありますか? (またはさらに良いことに、削除されたファイルのハンドルを開いたままにしておくと、どのプロセスがほとんどのスペースを占有しますか?)
zsh
を使用すると、
ls -lLrS /proc/*/fd/*(-l0)
それらをファイルサイズ順にリストします(wc -c
のように、ディスク使用量ではありません)。
ディスク使用量については、次のことができます。
zmodload zsh/stat
bydu() zstat -A REPLY +block -- $REPLY
ls -lLsU /proc/*/fd/*(-l0no+bydu)
(GNU ls
はソートしない場合は-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
(ここではキビバイト単位)