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