Как решить проблему, если коллега удаляет файлы через rm -rf, но место на диске не освобождается?

«Как решить проблему, если коллега удаляет файлы через rm -rf, но место на диске не освобождается?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Эта ситуация возникает, когда файл удален из файловой системы (unlink), но один или несколько процессов продолжают держать его открытым. Пока дескриптор открыт, данные на диске не будут освобождены. Решение — найти и перезапустить "висячие" процессы.

Диагностика и решение:

  1. Найти открытые удаленные файлы: Используйте lsof для поиска процессов, удерживающих дескрипторы удаленных (обозначаются (deleted)) файлов.

    # Показать все открытые удаленные файлы
    sudo lsof +L1
    # Или искать в конкретном разделе (например, /var)
    sudo lsof /var | grep deleted
  2. Определить процесс и освободить место: В выводе lsof будет указан PID процесса и имя команды. Самый безопасный способ — аккуратно перезапустить соответствующий сервис.

    # Если это системный сервис (например, nginx, java)
    sudo systemctl restart nginx
    # Если это не сервис, можно отправить сигнал HUP для переоткрытия логов
    sudo kill -HUP <PID>

    Примечание: Сигнал SIGHUP часто заставляет демоны перечитать конфигурацию и переоткрыть лог-файлы, что может освободить старый дескриптор.

  3. Крайняя мера: Если перезапуск невозможен, файл можно "обнулить" через /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, если немедленный перезапуск сервиса нежелателен.