Что делать, когда результат выполнения df и du отличается?
Jul 25, 2016 15:05 · 274 words · 2 minute read
Известны случаи, когда вывод команды 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