Очистка дискового пространства от хлама
14.01.2020 | by root
Возникла как-то необходимость разобраться с дисковым пространством сервера под управлением Ubuntu Server. Решил написать скрипт, который сможет мне в этом помочь.
Первым делом, очищаем то, что достаётся нам apt, а именно локальный реп от получаемых установочных файлов, бесполезных пакетов и пакетов, которые были установлены для удовлетворения зависимостей, ныне не нужных. Для этого выполняем следующие 3 команды:
sudo apt-get clean
sudo apt-get autoclean
sudo apt-get autoremove
Отдельно вынесу команду очистки системы от старых ядер. Возможно, кому-то это покажется небезопасно, но, зачастую, они тоже не пригодятся
sudo apt-get purge $(dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | head -n -1) --assume-yes
Далее следуют две команды, которые, в общем-то, не нужны на сервере, но могут пригодиться на домашнем ПК:
sudo rm -rf ~/.thumbnails/*
sudo rm -rf /usr/share/doc/*
Данные команды очищают превьюхи, созданные, в основном, Nautilus`ом и очищают файлы справочной информации установленных программ, которая не сильно нужна в быту.
Почистим логи systemd, оставив их количество вплоть до 128Мб, а новизну — 1 день:
journalctl --vacuum-size=128M
journalctl --vacuum-time=1d
Почистим сессии пользователей старше 7 дней (при желании можно вырезать всё вплоть до сегодняшнего дня, установив параметр поиска в «+1» вместо «+7»):
find /home/admin/tmp -type f -mtime +7 -print0 | xargs -0 rm -f
К следующей команде нужно отнестись внимательно, она подчищает папку /backup, оставляя резервные копии за последние 3 дня. Возможно, для кого-то это покажется недостаточным, можно указать необходимый интервал:
nice find /backup -type f -name '''tmp*''' -ctime +3 -delete
При написании утилиты вполне интересно было бы узнать, какой объём пространство удалось отыграть у системы. Для этого в начале и конце скрипта соответственно поместим данные команды:
DF=`df -m / | awk '{print $3}' |tail -1` #Посчитаем текущий объём свободного пространства на жёстком диске
....
DF_done=`df -m / | awk '{print $3}' |tail -1` #Посчитаем итоговый объём незанятного дискового пространства
let DF_res=$DF_done-$DF #Вычислим разницу, получим эффективность работы программы в освобождённых Mb
Итоговый листинг программы содержит некоторые дополнения в виде визуального меню и возможности запуска через параметры.
#!/bin/bash
DF=`df -m / | awk '{print $3}' |tail -1` #Посчитаем текущий объём свободного пространства на жёстком диске
SCRIPTNAME=" Метла v0.2.1 "
start()
{
echo -en "\033[37;1;41m \033[44m\n"
echo -en "\033[37;1;41m $SCRIPTNAME \033[44m\n"
echo -en "\033[37;1;41m Поехали.. \033[44m\n"
echo -en "\033[37;1;41m \033[44m\n"
}
#Функция clean
fclean () {
sudo apt-get clean
echo "Clean done."
}
#Функция autoclean
fautoclean () {
sudo apt-get autoclean
echo "Autoclean done."
}
#Функция autoremove
fautoremove () {
sudo apt-get autoremove
echo "Autoremove done."
}
#Функция очистки ~/.thumbnails/* (не особо актуально на машинах без gui)
fthumbnails () {
sudo rm -rf ~/.thumbnails/*
echo "Thumbnails f*cked"
}
#Функция очистки /usr/share/doc/*
fdocs () {
sudo rm -rf /usr/share/doc/*
echo "Docs f*cked"
}
#Функция удаления старых ядер системы
fkernel () {
sudo apt-get purge $(dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | head -n -1) --assume-yes
echo "Old kernels f*cked"
}
#Функция очистки логов systemd
fjournal () {
journalctl --vacuum-size=128M
journalctl --vacuum-time=1d
}
#Функция очистки сессий
fsession () {
find /home/admin/tmp -type f -mtime +1 -print0 | xargs -0 rm -f
}
ftmp () {
nice find /backup -type f -name '''tmp*''' -ctime +3 -delete
}
#Функция перебора решений пользователя
fcase () {
case "$param" in
0) echo "гавно случается";;
-c) start; fclean;;
-l) start; fautoclean;;
-r) start; fautoremove;;
-t) start; fthumbnails;;
-d) start; fdocs;;
-k) start; fkernel;;
-j) start; fjournal;;
-s) start; fsession;;
-t) start; ftmp;;
-a) start; fclean; fautoclean; fautoremove; fthumbnails; fdocs; fkernel;fjournal;ftmp;fsession;;
*) echo э сука бля;;
esac
}
#Основная функция
metlisсhe () {
#Выводим меню
DIALOG=${DIALOG=dialog} #Создаём диалог
tempfile=`mktemp 2>/dev/null` || tempfile=/tmp/test$ #Создаём временный файл 2мя способами
trap "rm -f $tempfile" 0 1 2 5 15 #Удалим временный файл по завершению
$DIALOG --clear --title "$SCRIPTNAME" \
--menu "Чем займёмся сегодня?" 17 51 10 \
"-c" "clean" \
"-l" "autoclean" \
"-r" "autoremove" \
"-t" "Очистка ~/.thumbnails/*" \
"-d" "Очистка /usr/share/doc/* " \
"-k" "Удаление старых ядер системы" \
"-j" "Очистка журнала" \
"-t" "Очистка временных файлов backup"\
"-a" "По всему списку" 2> $tempfile
param=`cat $tempfile` #Записываем результат выбора пользователя в переменную $param
fcase #Запускаем перебор по выбранному решению
DF_done=`df -m / | awk '{print $3}' |tail -1` #Посчитаем итоговый объём незанятного дискового пространства
let DF_res=$DF_done-$DF #Вычислим разницу, получим эффективность работы программы в освобождённых Mb
#Выведем итог работы программы
DIALOG=${DIALOG=dialog}
$DIALOG --title "$SCRIPTNAME" --clear \
--msgbox $DF_res"Mb освобождено" 10 40
echo "See you later ;]"
}
if [ -n "$1" ]
then
param="1"
while [ -n "$1" ]
do
param=$1
fcase
shift
done
else
DIALOG=${DIALOG=dialog}
$DIALOG --title "$SCRIPTNAME" --clear \
--yesno "Будем чистить винтик?" 10 40
case $? in
0) metlisсhe;;
1) echo "А зря!"; exit 0;;
255) echo "А зря!"; exit 0;;
esac
fi
DF_done=`df -m / | awk '{print $3}' |tail -1` #Посчитаем итоговый объём незанятного дискового пространства
let DF_res=$DF_done-$DF #Вычислим разницу, получим эффективность работы программы в освобождённых Mb
#Очищаем параметры и экран
clear
cat /tmp/param
tput sgr0
df -h /