Ответ
Эта ситуация возникает, когда файл удален из файловой системы (unlink), но один или несколько процессов продолжают держать его открытым. Пока дескриптор открыт, данные на диске не будут освобождены. Решение — найти и перезапустить "висячие" процессы.
Диагностика и решение:
-
Найти открытые удаленные файлы: Используйте
lsofдля поиска процессов, удерживающих дескрипторы удаленных (обозначаются(deleted)) файлов.# Показать все открытые удаленные файлы sudo lsof +L1 # Или искать в конкретном разделе (например, /var) sudo lsof /var | grep deleted -
Определить процесс и освободить место: В выводе
lsofбудет указан PID процесса и имя команды. Самый безопасный способ — аккуратно перезапустить соответствующий сервис.# Если это системный сервис (например, nginx, java) sudo systemctl restart nginx # Если это не сервис, можно отправить сигнал HUP для переоткрытия логов sudo kill -HUP <PID>Примечание: Сигнал
SIGHUPчасто заставляет демоны перечитать конфигурацию и переоткрыть лог-файлы, что может освободить старый дескриптор. -
Крайняя мера: Если перезапуск невозможен, файл можно "обнулить" через
/proc, что освободит место, но процесс продолжит работу:sudo truncate -s 0 /proc/<PID>/fd/<FD_NUMBER>
Профилактика в DevOps-практиках:
- Использование logrotate: Всегда настраивайте
logrotateдля критичных сервисов. Он использует механизмcopytruncateилиpostrotateскрипты с перезапуском/сигналом, что безопасно освобождает дисковое пространство. - Мониторинг: Настройка алертов в Prometheus/Grafana на низкое свободное место (
node_filesystem_avail_bytes). - Обучение команды: Рекомендовать использовать
truncate -s 0 file.logили> file.logдля очистки активных логов вместоrm, если немедленный перезапуск сервиса нежелателен.