3

Почему есть различия между выходами команд df и du ?

Почему они не точны в выводе?

# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 1012M 394M 567M 42% /
/dev/sda2 99M 47M 48M 50% /boot
/dev/sda8 9.9G 1.5G 7.9G 16% /home
none 1004M 0 1004M 0% /dev/shm
/dev/sda9 347G 93G 236G 29% /srv
/dev/sda11 2.0G 81M 1.8G 5% /tmp
/dev/sda10 4.0G 1.3G 2.6G 33% /usr
/dev/sda6 4.0G 2.1G 1.8G 55% /usr/local
/dev/sda5 20G 19G 0 100% /var

Однако, если я делаю du -sh /var он сообщает, что используется только 4.6G:

# du -sh /var
4.6G /var

3 ответа3

8

Стандартной причиной этого является какой-то пользовательский процесс, сохраняющий удаленный файл открытым. Когда это происходит, пространство не видно через 'du', так как файл больше не виден в дереве каталогов. Однако пространство все еще используется файлом до тех пор, пока он не будет освобожден, и это может произойти только после того, как последний процесс, у которого файл открыт, либо закроет свой файловый дескриптор файла, либо завершит процесс. Вы можете использовать программу lsof, чтобы попытаться определить, какой процесс хранит открытый файл. Обычно это какой-то файл журнала или какой-то большой файл базы данных, который вращается, но какой-то более старый процесс все еще сохраняет файл журнала открытым.

источник : команда 'df' VS команда 'du'

4

Попробуйте это:
http://www.cyberciti.biz/tips/freebsd-why-command-df-and-du-reports-different-output.html
Если файлы удаляются (с помощью команды rm), когда они открываются или используются программой / процессом Linux, возникает проблема "открытого дескриптора файла", которая вводит в заблуждение файловую систему Linux, сообщая реальную цифру используемого дискового пространства или свободное место на диске.

Чтобы решить поддельную проблему "дискового пространства заполнено", т. Е. Вернуть "использованное дисковое пространство", вам нужно убить или прекратить "несуществующий процесс" - в этом случае команда rm, которая превращается в несуществующий процесс, в то время как файлы используются.

Как только эти несуществующие процессы будут завершены, проблема "открыть дескриптор файла" будет решена, и обе команды du и df согласятся сообщить о реальной файловой системе, использовавшей место на диске или свободное место на диске!

Как обнаружить и завершить или уничтожить несуществующие процессы, вызывающие проблему с дескриптором открытого файла, чтобы устранить разницу в используемом дисковом пространстве в командах du и df?

Для этого конкретного сценария команда lsof (команда list open file) отлично подходит для отображения света:

#lsof | grep "deleted"

и найдите идентификатор процесса Linux во втором столбце вывода команды lsof. Седьмой столбец - это размер файла, который "удаляется" (но не успешный и оказывается несуществующим процессом).

Теперь вам просто нужно уничтожить идентификаторы процессов Linux, чтобы увидеть правильный вывод DU и DF. Используйте следующую команду для уничтожения идентификаторов процессов

#lsof | grep "deleted" | awk '{print $2}' | xargs kill -9

Теперь проверьте использование диска обеими командами; ты не должен понимать разницу.

1

Это не относится к вашему случаю, но в целом важно помнить флаг -x для du . В противном случае он может войти в другие смонтированные файловые системы и определенно не будет соответствовать выводу df , который по умолчанию является файловой системой.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .