Почему не освобождается место после удаления логов в Linux?

«Почему не освобождается место после удаления логов в Linux?» — вопрос из категории Linux, который задают на 24% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Основная причина — удалённый файл всё ещё удерживается открытым дескриптором работающего процесса. В Linux место на диске освобождается только после того, как все жёсткие ссылки на файл удалены и все открытые дескрипторы закрыты.

Типичные сценарии и решения:

  1. Процесс держит файл открытым. Часто случается с демонами (nginx, app-server), которые пишут логи.

    • Проверка: lsof +L1 или lsof | grep deleted покажет процессы и размер удалённых, но открытых файлов.
    • Решение: Отправить процессу сигнал для переоткрытия логов (например, systemctl reload nginx или kill -HUP <PID>). Полный перезапуст (restart) также решит проблему.
  2. Использование logrotate без copytruncate. По умолчанию logrotate создаёт копию лога и просит процесс переоткрыть файл. Если процесс этого не делает (не поддерживает сигнал), старый дескриптор остаётся.

    • Решение: В конфигурации logrotate для проблемного сервиса используйте директиву copytruncate. Она копирует файл, а затем обрезает оригинал до нуля, не требуя от процесса переоткрытия.
      /var/log/myapp.log {
      daily
      rotate 7
      copytruncate  # Ключевая директива
      missingok
      }
  3. Монтирование в пространство имён контейнера. Файл может быть удалён внутри контейнера, но оставаться открытым на хосте.

Порядок диагностики:

  1. df -h — показывает «занятое» место, включая файлы с открытыми дескрипторами.
  2. du -sh /var/log/ — показывает реальный размер файлов в директории. Если df показывает много занятого, а du — мало, это явный признак проблемы.
  3. lsof | grep deleted — найти виновника.
  4. Принять меры (перезагрузка, copytruncate, очистка диска от других файлов).