Last active
June 3, 2025 04:59
-
-
Save jazz-it/6394ff80d1e1e1cbeaa00c49da3fe2e4 to your computer and use it in GitHub Desktop.
Linux Mint Regular Maintenance Script (Croatian)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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