Uma maneira complicada é assim:
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
Saída
...
....
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
Eu sei que isso não é perfeito. Por exemplo, se o nome do arquivo contiver "DEL", isso eliminaria esse arquivo da lista de saída.
lsof
também tem uma opção -F
descrita na SAÍDA PARA OUTROS PROGRAMAS seção. Usar isso pode ser mais simples.
Detalhes
lsof
imprime algo assim:
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
mantém arquivos regulares
grep -v "stat: No such file or directory"
Remova os arquivos com erro de estatística. (Eu não sei porque isso acontece)
grep -v DEL
Descarta os arquivos de mapa do Linux que foram excluídos;
Em lsof documentação :
''DEL'' for a Linux map file that have been deleted;
Após esse processamento, ficamos com algo parecido com isto:
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
O tamanho é a última segunda coluna, dependendo do valor da última coluna. Se a última coluna for (deleted)
, escolha a 3ª do último caso contrário, 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
Classifique, uniquifique e faça os bytes contarem legíveis por humanos