Я запустил df -h, ожидая, что использование диска упадёт. Не упало.
Всё ещё показывало 100% занято.
Ни ошибок, ни предупреждений. Просто те же цифры, будто я вообще ничего не удалял.
И вот тогда я понял, что удаление файла не всегда сразу освобождает место.
В Linux то, что мы называем "файлом", на самом деле состоит из двух частей: имени файла (по сути указателя) и inode (где лежат данные и метаданные). Когда ты удаляешь имя файла, ты просто убираешь указатель. Но inode с данными остаётся на диске, пока какой-то процесс держит файл открытым.
В моём случае веб-сервер всё ещё писал в тот самый лог. И хотя я удалил имя файла, процесс продолжал держать открытый файловый дескриптор. Inode оставался живым — его не видно обычными командами, но место он продолжал занимать.
Место освободилось только после перезапуска веб-сервера, когда все дескрипторы закрылись.
Поэтому нужны разные команды, чтобы увидеть реальную картину:
Проверить использование файловой системы:
df -h
Посмотреть реальные размеры директорий:
du -sh /var/log/*
Найти удалённые файлы, которые всё ещё держатся процессами:
lsof +L1
du показывает, что в директориях реально занимает место, а df сколько занято на уровне файловой системы.
Если они не совпадают, почти всегда причина = удалённые файлы, которые всё ещё открыты процессами.
По этой же причине нормальный log rotation не просто удаляет файлы. Такие инструменты, как logrotate, сначала переименовывают файл и отправляют сигнал процессу, чтобы он корректно закрыл старый дескриптор и открыл новый.
Три важных вывода:
Имя файла это всего лишь указатель на inode
Удаление происходит только тогда, когда inode больше никем не используется
При разборе проблем с диском всегда проверяй и df, и du
Мелочь, но понимание этого может спасти от очень странных и неприятных инцидентов в проде.
👉 Java Portal