Как освободить место на диске без перезапуска сервисов?

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

Ответ

В DevOps-практиках освобождение места без простоя сервисов — частая задача. Вот конкретные действия, которые я выполнял на продакшен-серверах:

1. Очистка логов и временных файлов:

  • Ротация и очистка логов: Используем logrotate для автоматического управления. Для ручной очистки старых логов:
     # Просмотреть кандидатов на удаление
     find /var/log -type f -name "*.log*" -mtime +7 -ls
     # Очистить содержимое файла без его удаления (если процесс держит дескриптор)
     truncate -s 0 /var/log/some-app.log
  • Очистка временных каталогов:
     find /tmp -type f -atime +1 -delete

2. Управление пакетами и кэшами:

  • Для APT: apt-get clean
  • Для YUM/DNF: yum clean all или dnf clean all
  • Очистка кэша Docker: docker system prune -a --volumes -f (с осторожностью, удалит все неиспользуемые данные).

3. Поиск крупных файлов и директорий:

   # Найти топ-10 самых больших директорий
   du -ah / | sort -rh | head -n 10
   # Найти файлы больше 100МБ
   find / -type f -size +100M -exec ls -lh {} ;

4. Работа с бэкапами и артефактами:

  • Удаление устаревших бэкапов по политике хранения (например, старше 30 дней):
     find /backups -type f -name "*.tar.gz" -mtime +30 -delete
  • Очистка старых артефактов сборки в CI/CD (например, в ~/.jenkins/workspace или /var/lib/jenkins).

Ключевой принцип: Всегда сначала выполняем команды с -ls, -print или -exec echo {} ;, чтобы проверить, что будет удалено. Для критичных логов используем truncate, а не rm, если процесс продолжает писать в файл.