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

Ответ

Освобождение места без остановки процессов — частая задача при работе с лог-файлами, временными данными или при переполнении диска в 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).

Ответ 18+ 🔞

А, ну это же классика, ёпта! Сидишь ты такой, работаешь, а тут — бац! — диск забит под завязку, овердохуища логов накопилось. И сервис-то живой, дышит, а места уже нет. Пиздец, да? Но не паникуй, есть способы почистить всё, даже не дёргая процессы.

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     # Что делать после того, как файлы покрутили
        # Послать сигнальчик процессу, чтоб он переоткрыл лог-файлы
        /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

# Посмотреть, кто сколько места в /var съел
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 там). А то вычистишь не то — и будет тебе хиросима, а не освобождение места. Доверия ебать ноль к этим операциям, если делаешь впопыхах.