Очистка дискового пространства от хлама

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 /