Skip to content

Instantly share code, notes, and snippets.

@jazz-it
Last active June 3, 2025 04:59
Show Gist options
  • Save jazz-it/6394ff80d1e1e1cbeaa00c49da3fe2e4 to your computer and use it in GitHub Desktop.
Save jazz-it/6394ff80d1e1e1cbeaa00c49da3fe2e4 to your computer and use it in GitHub Desktop.
Linux Mint Regular Maintenance Script (Croatian)
#!/bin/bash
set -euo pipefail
# Definicija boja i simbola za ispis (ako je izlaz terminal)
if test -t 1; then
GREEN=$'\033[32m'
YELLOW=$'\033[33m'
RED=$'\033[31m'
NC=$'\033[0m'
else
GREEN=""
YELLOW=""
RED=""
NC=""
fi
# Funkcije za ispis poruka
function info() { echo -e "${YELLOW}⧗ $1${NC}"; }
function success() { echo -e "${GREEN}✓ $1${NC}"; echo; }
function warn() { echo -e "${RED}⚠ $1${NC}"; echo; }
# Funkcija za usporedbu verzija (koristi sort -V)
# Vraća 0 ako je prva verzija starija od druge, inače 1.
is_older() {
local ver1="$1"
local ver2="$2"
if [[ "$ver1" == "$ver2" ]]; then
return 1
fi
if [[ "$(printf "%s\n%s" "$ver1" "$ver2" | sort -V | head -n1)" == "$ver1" ]]; then
return 0
else
return 1
fi
}
# Provjera da se skripta pokreće s root privilegijama
if [[ "$EUID" -ne 0 ]]; then
warn "Pokreni skriptu sa 'sudo'!"
exit 1
fi
#
# Zabilježimo početno stanje slobodnog prostora na sistemskoj particiji (u bajtovima)
initial_free=$(df --block-size=1 / | tail -1 | awk '{print $4}')
########################################
# APT održavanje sustava
########################################
info "Ažuriram paket podatke i instaliram najnovija ažuriranja..."
apt update && apt upgrade -y
success "Ažuriranje dovršeno."
########################################
# Interaktivno uklanjanje starijih kernela
########################################
info "Provjera i interaktivno uklanjanje kernela starijih od trenutno korištenog..."
# Dohvati trenutni kernel, npr. "5.15.0-139-generic"
current_kernel="$(uname -r)"
# Izbacujemo sufiks (npr. "-generic") radi usporedbe samo numeričkog dijela
current_base="$(echo "$current_kernel" | sed -r 's/-[a-z]+$//')"
info "Trenutni kernel: ${current_kernel}"
# Dohvati popis instaliranih linux-image i linux-headers paketa
image_pkgs=$(dpkg -l linux-image-[0-9]* 2>/dev/null | awk '/^ii/ {print $2}')
header_pkgs=$(dpkg -l linux-headers-[0-9]* 2>/dev/null | awk '/^ii/ {print $2}')
# Sastavi niz svih kernel verzija (normaliziranih uklanjanjem prefiksa i sufiksa)
all_versions=()
for pkg in $image_pkgs; do
ver="$(echo "$pkg" | sed -e 's/^linux-image-//')"
base="$(echo "$ver" | sed -r 's/-[a-z]+$//')"
all_versions+=("$base")
done
for pkg in $header_pkgs; do
ver="$(echo "$pkg" | sed -e 's/^linux-headers-//')"
base="$(echo "$ver" | sed -r 's/-[a-z]+$//')"
all_versions+=("$base")
done
# Ukloni duplikate
declare -A unique_versions
for ver in "${all_versions[@]}"; do
unique_versions["$ver"]=1
done
unique_list=()
for ver in "${!unique_versions[@]}"; do
unique_list+=("$ver")
done
# Sortiraj verzije pomoću sort -V
IFS=$'\n' sorted_versions=($(printf "%s\n" "${unique_list[@]}" | sort -V))
unset IFS
# Odredi kernele starije od trenutnog (kandidati za brisanje)
candidate_versions=()
echo -e "\nPopis instaliranih kernel verzija:"
for ver in "${sorted_versions[@]}"; do
if [[ "$ver" == "$current_base" ]]; then
marker="${GREEN}✓${NC}"
suffix="(trenutni kernel)"
elif is_older "$ver" "$current_base"; then
marker=" " # kandidat za brisanje
candidate_versions+=("$ver")
suffix="(za brisanje)"
else
marker="🔒"
suffix="(noviji kernel)"
fi
printf " [%s] %s %s\n" "$marker" "$ver" "$suffix"
done
if [ ${#candidate_versions[@]} -eq 0 ]; then
info "Nema kernela starijih od trenutno korištenog."
echo
else
echo ""
info "Kandidati za brisanje (stariji od trenutnog kernela) bit će uklonjeni."
read -r -p "${RED}PAŽNJA: Nastaviti s brisanjem kernela? (D/n): ${NC}" confirm
if [[ -z "$confirm" || "$confirm" =~ ^[dD]$ ]]; then
info "Pripremam brisanje kernela..."
packages_to_remove=()
# Za svaku kandidat verziju, odaberi pripadajuće linux-image i linux-headers pakete
for ver in "${candidate_versions[@]}"; do
for pkg in $image_pkgs; do
pkg_ver=$(echo "$pkg" | sed -r 's/^linux-image-//' | sed -r 's/-[a-z]+$//')
if [[ "$pkg_ver" == "$ver" ]]; then
packages_to_remove+=("$pkg")
fi
done
for pkg in $header_pkgs; do
pkg_ver=$(echo "$pkg" | sed -r 's/^linux-headers-//' | sed -r 's/-[a-z]+$//')
if [[ "$pkg_ver" == "$ver" ]]; then
packages_to_remove+=("$pkg")
fi
done
done
info "Paketi koji će biti uklonjeni:"
for pkg in "${packages_to_remove[@]}"; do
echo " $pkg"
done
read -r -p "Jeste li sigurni da želite obrisati navedene pakete? (d/n): " final_confirm
if [[ "$final_confirm" == "d" ]]; then
apt-get purge -y "${packages_to_remove[@]}"
apt autoremove --purge -y && apt autoclean -y
success "Stariji kerneli uspješno obrisani."
else
info "Brisanje kernela prekinuto."
echo
fi
else
info "Brisanje kernela prekinuto."
echo
fi
fi
# Provjera ostataka direktorija modula u /lib/modules koji NE pripadaju trenutno aktivnim
# ili novijim kernelima, te su stariji od trenutnog kernela.
info "Tražim ostatke starih direktorija modula u /lib/modules..."
# Dohvati trenutno korišteni kernel i izdvoji njegovu osnovnu verziju (bez sufiksa, npr. "-generic")
current_kernel=$(uname -r)
current_base=$(echo "$current_kernel" | sed -r 's/-[a-zA-Z]+$//')
# Dobij popis instaliranih kernel verzija (bez sufiksa, npr. "5.15.0-141")
installed_kernels=$(dpkg -l | awk '/^ii/ && ($2 ~ /^linux-image(-unsigned)?-[0-9]+\.[0-9]+\.[0-9]+-[0-9]+-/) {
match($2, /[0-9]+\.[0-9]+\.[0-9]+-[0-9]+/);
print substr($2, RSTART, RLENGTH)
}' | sort -u)
# info "Instalirani kerneli: $installed_kernels"
# Iteriraj kroz sve direktorije u /lib/modules
for moddir in /lib/modules/*; do
if [ -d "$moddir" ]; then
dir_name=$(basename "$moddir")
# Izdvoji osnovnu verziju iz imena direktorija (npr. "5.15.0-141" iz "5.15.0-141-generic")
base_version=$(echo "$dir_name" | grep -oE '^[0-9]+\.[0-9]+\.[0-9]+(-[0-9]+)?')
# Provjeri je li base_version stariji od trenutačnog kernela
if is_older "$base_version" "$current_base"; then
# Ako direktorij pripada instaliranom kernelu, preskoči ga
if echo "$installed_kernels" | grep -Fxq "$base_version"; then
info "Direktorij $moddir pripada instaliranom kernelu ($base_version), preskačem."
else
# Provjeri je li neka datoteka unutar direktorija u uporabi
if lsof +D "$moddir" >/dev/null 2>&1; then
warn "Direktorij $moddir je trenutno u uporabi, preskačem."
else
info "Uklanjam zastarjeli direktorij modula: $moddir (verzija: $base_version)"
rm -rf "$moddir"
success "Direktorij $moddir je uspješno uklonjen."
fi
fi
else
# Razdvoji poruke: ako je base_version jednaka current_base, onda pripada trenutnom kernelu,
# a inače (nije stariji pa je noviji) pripada novijem kernelu
if [ "$base_version" = "$current_base" ]; then
info "Direktorij $moddir pripada trenutno aktivnom kernelu, preskačem."
else
info "Direktorij $moddir pripada novijem kernelu, preskačem."
fi
fi
fi
done
echo
########################################
# Daljnje održavanje sustava
########################################
# Provjera postoji li thumbnail cache za brisanje
if ls ~/.cache/thumbnails/*/*.png ~/.thumbnails/*/*.png 1>/dev/null 2>&1; then
info "Brišem thumbnail cache..."
rm -v -f ~/.cache/thumbnails/*/*.png ~/.thumbnails/*/*.png
success "Thumbnail cache očišćen."
else
info "Nema thumbnail cache datoteka za brisanje."
echo
fi
# Flush DNS cache (ako postoji systemd-resolve)
if command -v systemd-resolve &>/dev/null; then
info "Čistim DNS cache..."
sudo systemd-resolve --flush-caches
success "DNS cache očišćen."
fi
# Čišćenje Flatpak paketa i cache-a
if command -v flatpak &>/dev/null; then
info "Čišćenje Flatpak nepotrebnih paketa..."
flatpak uninstall --unused
success "Flatpak paketi očišćeni."
fi
info "Brišem Flatpak cache datoteke..."
sudo rm -rfv /var/tmp/flatpak-cache-*
success "Flatpak cache očišćen."
# Konfiguracija Snap sustava i čišćenje starih snap snapshotova
if command -v snap &>/dev/null; then
info "Postavljam Snap sustav (zadržavam samo 2 najnovija snapshot-a)..."
sudo snap set system refresh.retain=2
# Provjera pokrenutih Snap aplikacija
if pgrep -a -f "/snap/" > /dev/null; then
info "Sljedeće Snap aplikacije su trenutno pokrenute:"
pgrep -a -f "/snap/" | sed -r 's|.*\/snap/([^/]+)/.*|\1|' | sort -u
warn "Zatvorite navedene aplikacije i ponovo pokrenite skriptu maintenance."
exit 1
else
info "Pokrećem operacije čišćenja Snap paketa..."
LANG=en_US.UTF-8 snap list --all | awk '/disabled/{print $1, $3}' |
while read snapname revision; do
snap remove "$snapname" --revision="$revision"
done
success "Snap paketi očišćeni."
fi
fi
# Brisanje i rotacija journal logova
info "Rotiram i čistim journal logove..."
sudo journalctl --rotate
sudo journalctl --vacuum-time=1s
success "Journal logovi očišćeni."
# Opcionalno: Čišćenje APT cache-a
info "Brišem APT cache..."
apt clean
success "APT cache očišćen."
# Čišćenje preostalih konfiguracijskih datoteka uklonjenih paketa (rc paketi)
info "Čišćenje preostalih konfiguracijskih datoteka (rc paketi)..."
rc_pkgs=$(dpkg -l | grep --color=auto --exclude-dir={.bzr,CVS,.git,.hg,.svn,.idea,.tox} '^rc' | awk '{print $2}' || true)
if [[ -z "$rc_pkgs" ]]; then
info "Nisu pronađeni ostaci uklonjenih paketa."
echo
else
echo "$rc_pkgs" | xargs dpkg --purge
success "Ostaci uklonjenih paketa obrisani."
fi
# Izračunaj koliko je prostora oslobođeno tijekom održavanja
final_free=$(df --block-size=1 / | tail -1 | awk '{print $4}')
space_freed=$(( final_free - initial_free ))
human_space=$(numfmt --to=iec --format="%.1f" -- "$space_freed")
info "Oslobođeno je: ${human_space} prostora na sistemskoj particiji."
dash=$(printf '─%.0s' {1..23})
df -h / | awk -v dashes="$dash" 'NR==2 {
gsub(/%/, "", $5);
used=$3; avail=$4; total=$2; p_used=$5; p_avail=100 - p_used;
printf "%-12s %5s %4s\n", "Iskorišteno:", used, p_used"%";
printf "%-12s %5s %4s\n", "Slobodno:", avail, p_avail"%";
printf "%s\n", dashes;
printf "%-12s %5s %4s\n", "Ukupno:", total, "100%";
}'
echo -e "\n${GREEN}✔ Održavanje sustava završeno.${NC}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment