
プロセスで開かれたすべてのファイルの中で最大のファイルを見つけます。
lsof
すでに開いているファイルとサイズがあります。正しいパラメータを渡してlsof
出力を処理できます。
答え1
洗練された方法は次のとおりです。
lsof \
| grep REG \
| grep -v "stat: No such file or directory" \
| grep -v DEL \
| awk '{if ($NF=="(deleted)") {x=3;y=1} else {x=2;y=0}; {print $(NF-x) " " $(NF-y) } }' \
| sort -n -u \
| numfmt --field=1 --to=iec
出力
...
....
129M /var/log/maillog
166M /var/log/nginx/access_log
172M /var/log/metrics/kubernetes/kubelet.log
185M /var/log/metrics/kubernetes/etcd.log
257M /var/log/metrics/kubernetes/etcd.log.1
335M /var/log/metrics/kubernetes/kubelet.log.1
私はそれが完璧ではないことを知っています。たとえば、ファイル名に「DEL」が含まれている場合、出力リストからファイルが消去されます。に記載されているオプションlsof
もあります。-F
他のプログラムの出力部分。使用する方が簡単かもしれません。
詳細
lsof
次のように印刷します。
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,0 4096 128 /
tuned 2975 root 7u REG 253,0 4096 805307770 /tmp/ffiKkVeXD (deleted)
python2 49888 49890 root DEL REG 0,18 196039884 /dev/shm/sem.NXPFow
systemd 1 root mem REG 253,0 90664 10063 /usr/lib64/libz.so.1.2.7
java 149435 175229 box 69r REG 253,0 350872273 808108999 /box/var/log/metrics/kubernetes/kubelet.log.1
java 149435 149580 box 107w FIFO 0,8 0t0 272526226 pipe
prometheu 147867 148211 root mem REG 253,6 31457463 /lib64/ld-2.12.so (stat: No such file or directory)
grep REG
一般ファイルのアーカイブ
grep -v "stat: No such file or directory"
統計エラーのあるファイルを削除します。 (なぜこれが起こるのかわかりません)
grep -v DEL
削除されたLinuxマッピングファイルを削除します。
lsofから文書:
「DEL」は削除されたLinuxマッピングファイルを表します。
この処理の後、次のような結果が得られる。
tuned 2975 root 7u REG 253,0 4096 805307770 /tmp/ffiKkVeXD (deleted)
systemd 1 root mem REG 253,0 90664 10063 /usr/lib64/libz.so.1.2.7
java 149435 175229 box 69r REG 253,0 350872273 808108999 /box/var/log/metrics/kubernetes/kubelet.log.1
サイズは、最後の列の値に応じて、下から3番目または2番目の列です。最後の列が(deleted)
最後から3番目の列を選択した場合、それ以外の場合は2番目の列を選択します。
awk '{if ($NF=="(deleted)") {x=3;y=1} else {x=2;y=0}; {print $(NF-x) " " $(NF-y) } }'
sort -n -u | numfmt --field=1 --to=iec
バイト数を並べ替え、一意化、人が読めるように設定
答え2
-F
オプションを使用してlsof
取得できます。中程度の痛みしかない機械で解析できるほぼ明確な出力。lsof
ファイル名の改行が\n
。
出力にはlsof
1 行に 1 つのフィールドが含まれます。各名前の最初の文字はフィールドタイプを表し、行の残りの部分はフィールド値を表します。フィールドは、p
=PID(指定されたプロセスの最初の記述子にのみ適用されます)、f
= descriptor、t
= type(REG
通常のファイルの場合はサイズがある唯一のタイプ)、s
= size(使用可能な場合のみ)、n
= nameです。次のawkコードは、サイズのあるアイテムを収集し、サイズとファイル名を印刷します。残りのパイプラインは出力をソートし、最大サイズの項目を保持します。
lsof -Fnst | awk '
{ field = substr($0,1,1); sub(/^./,""); }
field == "p" { pid = $0; }
field == "t" { if ($0 == "REG") size = 0; else next; }
field == "s" { size = $0; }
field == "n" && size != 0 { print size, $0; }
' | sort -k1n -u | tail -n42 | sed 's/^[0-9]* //'
答え3
次のことができます。
lsof | grep REG | awk '{ print $1,$7,$9 }' | sort -t ' ' -k 2 -V
awk を使用して、コマンド、サイズ、ファイル名を含むように出力をフィルタリングし、2 番目の列であるサイズに基づいてソートします。 -ティー区切り文字を指定し、-V「自然な」順序 - したがって、1、10、2ではなく1、2、10がこのようにソートされます。-Kソートするキー(ソートしたい列)。