Как освободить место на диске в Linux, не останавливая процессы?

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

Ответ

Освобождение места без остановки процессов — частая задача при работе с лог-файлами, временными данными или при переполнении диска в production-среде. Вот проверенные методы:

1. Очистка или ротация лог-файлов: Если процесс пишет в файл и держит его дескриптор открытым, можно очистить содержимое файла, не удаляя его (inode останется тем же).

# Способ 1: Использование утилиты truncate
sudo truncate -s 0 /var/log/application.log

# Способ 2: Перенаправление пустого вывода (более распространенный)
sudo sh -c '> /var/log/application.log'
# Или
sudo : > /var/log/application.log

После этих операций файл будет пустым, но процесс продолжит писать в него.

2. Настройка logrotate (правильный, долгосрочный подход): Утилита logrotate автоматически ротирует, сжимает и удаляет старые логи. Конфигурация обычно в /etc/logrotate.d/.

Пример конфига /etc/logrotate.d/myapp:

/var/log/myapp/*.log {
    daily          # Ротировать ежедневно
    rotate 30      # Хранить 30 архивных копий
    compress       # Сжимать архивы (gzip)
    delaycompress  # Сжимать не сразу, а со следующей ротацией
    missingok      # Не выдавать ошибку, если файл отсутствует
    notifempty     # Не ротировать пустые файлы
    create 0644 appuser appgroup # Создать новый файл с указанными правами
    sharedscripts  # Скрипты postrotate выполняются один раз для всех логов
    postrotate     # Действие после ротации
        # Отправка сигнала приложению на reopen лог-файлов (например, для nginx, app-серверов)
        /usr/bin/killall -HUP myapp_process 2> /dev/null || true
    endscript
}

3. Поиск и удаление ненужных больших файлов:

# Найти файлы больше 100МБ
sudo find / -type f -size +100M -exec ls -lh {} ; 2>/dev/null | head -20

# Удалить старые файлы в директории /tmp
sudo find /tmp -type f -mtime +7 -delete

# Анализ использования диска по директориям
sudo du -sh /var/* | sort -hr

4. Очистка кэша пакетного менеджера:

# Для apt (Debian/Ubuntu)
sudo apt clean          # Очищает все кэшированные .deb пакеты
sudo apt autoclean      # Удаляет устаревшие кэшированные пакеты

# Для yum/dnf (RHEL/CentOS/Fedora)
sudo yum clean all
# или
sudo dnf clean all

Важное предостережение: Перед массовым удалением всегда проверяйте, что удаляете, особенно в корневой файловой системе. Остановка процесса — иногда более безопасный вариант, если есть возможность его быстрого перезапуска (например, через systemd).