Условие:
Вы замечаете, что на сервере
/var/log неожиданно «занялось» много места. Проверяете это так:
df -h /var
И видите, что диск почти полностью заполнен. Но при этом, когда проверяете размер файлов в
/var/log:
du -sh /var/log
— оказывается, что размер логов совсем небольшой, явно не соответствующий тому, что показывает
df.❓ Вопрос:
Почему возникает такая ситуация? Что именно занимает место, если файлы почти пустые? Как это исправить, не перезагружая сервер?
🔍 Подсказка:
На сервере активно работают несколько приложений, которые записывают логи. Недавно был произведён
logrotate, старые логи удалились.---
✅ Разбор:
💥 Подвох:
Многие думают, что после удаления файла место сразу освобождается. Но в Linux есть важный нюанс: если процесс всё ещё держит файл открытым, даже после удаления файла из файловой системы, его содержимое продолжает занимать место на диске.
Вот что происходит:
-
du показывает размер существующих файлов, поэтому он маленький (ведь файлы удалены). -
df показывает реальное использование блочного устройства, и оно включает те данные, которые всё ещё заняты удалёнными, но открытыми файлами.🚩 Это классическая ситуация после
logrotate: старые логи удаляются, но процессы, которые их писали (например, nginx, `mysql`), продолжают держать дескрипторы открытыми.🔧 Как найти виновника:
Используем
lsof для поиска удалённых, но ещё открытых файлов:```bash
lsof | grep deleted
```
Вы увидите что-то вроде:
```
nginx 1234 ... /var/log/nginx/access.log (deleted)
```
🛠 Как исправить без перезагрузки:
1️⃣ Перезапустить приложение, которое держит файл открытым:
```bash
systemctl restart nginx
```
2️⃣ Если нельзя перезапустить, можно попробовать «сбросить» файл, подменив его на новый (подходит не всегда).
---
✅ Вывод:
•
df и du показывают разное, потому что считают разными методами: -
df: что реально занято на диске (включая удалённые, но ещё открытые файлы) -
du: что физически доступно через файловую систему• Если место не освобождается после удаления файла — ищите открытые файловые дескрипторы удалённых файлов. Это классика для DevOps!
💡 Бонус-вопрос для гуру:
Что произойдёт, если в
lsof вы видите удалённый файл, но процесс — это docker? Как поступить в этом случае? 😉