в debian, ubuntu

Что делать, когда результат выполнения 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

Добавить комментарий