TGViewer
Java Portal | Программирование Java Portal | Программирование @java_iibrary · 11.6K subscribers
Post #1951 2.6K
В начале карьеры я удалил 5GB лог-файл на продовом сервере, который уже почти забился.

Я запустил 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
  • 👍 23
  • ❤ 6
  • 🔥 4
  • 😁 1
More from @java_iibrary
  1. Sep 28, 2026Проблема в продакшене. Приложение зависло. Вы запускаете: jstack <pid> Через несколько сек…
  2. Sep 27, 2026Java-разработчики, CopyOnWriteArrayList создаёт копию всего внутреннего массива при каждом…
  3. Sep 27, 2026Java-разработчики, ConcurrentHashMap потокобезопасен. Но он не блокирует всю коллекцию при…
  4. Sep 26, 2026Во многих приложениях есть такой эндпоинт. Фронтенд удаляет JWT после того, как пользовате…
  5. Sep 26, 2026Java: используйте Deque вместо Stack для работы по принципу LIFO («последним пришёл — перв…
  6. Sep 25, 2026Каждый Java-разработчик использует HashMap. Но задумывались ли вы… Почему его ёмкость всег…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →