Что делать, когда результат выполнения df и du отличается?

Jul 25, 2016 15:05 · 274 words · 2 minute read df du

Известны случаи, когда вывод команды df значительно отличается от вывода команды du. Чаще всего такое случается с файлами логов — давайте разберемся с этим вопросом на конкретном примере!

Итак, результат выполнения df выглядит так:

df -h | grep log
/dev/mapper/sata-log           50G  9.0G   41G  19% /var/log

При этом результат выполнения du в каталоге /var/log следующий:

du -h
4.0K	./chkrootkit
1.4G	./sphinx
144K	./zabbix
224K	./apt
12K	./fsck
44K	./munin
84K	./mysql
416K	./exim4
48K	./ConsoleKit
20K	./gearman-job-server
4.0K	./sysstat
14M	./installer/cdebconf
15M	./installer
44K	./newrelic
136K	./corosync
4.0K	./ntpstats
1.5G	.

С помощью команды lsof посмотрим какие файлы в каталоге /var/log еще используются процессами, хотя на самом деле были удалены:

lsof | grep /var/log | grep deleted
gearmand   2755             gearman    4w      REG              254,5  8013072051    1966085 /var/log/gearman-job-server/gearman.log.1 (deleted)
gearmand   2755  2759       gearman    4w      REG              254,5  8013072051    1966085 /var/log/gearman-job-server/gearman.log.1 (deleted)
gearmand   2755  2760       gearman    4w      REG              254,5  8013072051    1966085 /var/log/gearman-job-server/gearman.log.1 (deleted)
gearmand   2755  2761       gearman    4w      REG              254,5  8013072051    1966085 /var/log/gearman-job-server/gearman.log.1 (deleted)
gearmand   2755  2762       gearman    4w      REG              254,5  8013072051    1966085 /var/log/gearman-job-server/gearman.log.1 (deleted)
gearmand   2755  2763       gearman    4w      REG              254,5  8013072051    1966085 /var/log/gearman-job-server/gearman.log.1 (deleted)
gearmand   2755  2764       gearman    4w      REG              254,5  8013072051    1966085 /var/log/gearman-job-server/gearman.log.1 (deleted)

Зная PID процесса (2755), который использует «удаленные» файлы, мы можем узнать файловый дескриптор этого «удаленного» файла:

find /proc/2755/fd -ls | grep  '(deleted)'
562637320    0 l-wx------   1 gearman  gearman        64 Jul 20 09:14 /proc/2755/fd/4 -> /var/log/gearman-job-server/gearman.log.1\ (deleted)

Для очистки (truncate) содержимого файла следует использовать команду cat /dev/null > /proc/$pid/fd/$fd, где $pid и $fd соответственно PID процесса (2755) и файловый дескриптор (4):

cat /dev/null > /proc/2755/fd/4

После проделанных действий проверим результат выполнения df:

df -h | grep log
/dev/mapper/sata-log           50G  1.5G   48G   3% /var/log
tweet Share