Skrypt aktualizacjia i konserwacja

Potrzebujesz pomocy z C, C++, perl, python, itp.
Awatar użytkownika
Sol-Lex
Posty: 2
Rejestracja: 19 listopada 2024, 13:26
Lokalizacja: śląsk - Będzin

Skrypt aktualizacjia i konserwacja

Post autor: Sol-Lex »

Jak ktoś znajdzie chwilkę czasu (nie spieszy mi się), to proszę o sprawdzenie tego skryptu.
Dla wyjaśnienia:
Zamiast używać apt dla Debiana, zainstalowałem nakładkę nala, która umożliwia między innymi możliwość usuwania wprowadzonych zmian.
Chciałem mieć możliwość zaktualizować system i zarazem konserwacji (usuwanie) niepotrzebne pliki „konserwacja systemu".
Wydając komendę

sudo ./aktualizacja.sh

W przypadku gdy coś pójdzie nie tak wydam komendę

sudo ./konserwacja.sh --undo

Jak działa skrypt:
Sprawdza aktualizacje systemu i flatpaków.
Pobiera i aktualizuje.
Usuwa niepotrzebne pliki.
Wyświetla na ekranie postęp (tryb gadatliwy).
Zapisuje do plików log, co zrobił.
Usuwa pliki log (500 MB i starszych niż 3 tygodnie).
Co powinienem zmienić lub dodać do skryptu,

Kod: Zaznacz cały

#!/bin/bash

LOG_FILE="/var/log/konserwacja.log"

log_and_print() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}

UNDO=false

# Sprawdzenie flagi --undo
for arg in "$@"; do
    if [[ "$arg" == "--undo" ]]; then
        UNDO=true
    fi
done

log_and_print "=== Rozpoczęcie konserwacji systemu ==="

if $UNDO; then
    log_and_print "Cofanie ostatniej aktualizacji za pomocą nala."
    nala history undo 2>&1 | tee -a "$LOG_FILE"
    log_and_print "Ostatnia aktualizacja została cofnięta."
else
    log_and_print "Pominięto cofanie ostatniej aktualizacji."
fi

# Aktualizacja systemu za pomocą nala
log_and_print "Aktualizacja listy pakietów za pomocą nala."
nala update 2>&1 | tee -a "$LOG_FILE"

log_and_print "Aktualizacja systemu za pomocą nala."
nala upgrade -y 2>&1 | tee -a "$LOG_FILE"

# Aktualizacja Flatpak
log_and_print "Aktualizacja pakietów Flatpak."
flatpak update 2>&1 | tee -a "$LOG_FILE"

# Usuwanie nieużywanych pakietów i czyszczenie systemu
log_and_print "Usuwanie nieużywanych pakietów i czyszczenie systemu."
nala autoremove -y 2>&1 | tee -a "$LOG_FILE"
nala clean 2>&1 | tee -a "$LOG_FILE"

# Usuwanie nieużywanych Flatpaków
log_and_print "Usuwanie nieużywanych Flatpaków."
flatpak uninstall --unused -y 2>&1 | tee -a "$LOG_FILE"

# Czyszczenie pamięci podręcznej użytkownika
log_and_print "Czyszczenie pamięci podręcznej użytkownika."
rm -rf ~/.cache/* 2>&1 | tee -a "$LOG_FILE"

# Czyszczenie logów apt
log_and_print "Czyszczenie logów apt."
sudo rm -rf /var/log/apt/* 2>&1 | tee -a "$LOG_FILE"

# Optymalizacja logów systemowych
log_and_print "Optymalizacja logów systemowych."
sudo journalctl --vacuum-size=500M 2>&1 | tee -a "$LOG_FILE"
sudo journalctl --vacuum-time=3weeks 2>&1 | tee -a "$LOG_FILE"

log_and_print "=== Konserwacja systemu zakończona ==="
Awatar użytkownika
dedito
Moderator
Posty: 3581
Rejestracja: 18 listopada 2013, 21:07
Lokalizacja: Gliwice

Re: Skrypt aktualizacjia i konserwacja

Post autor: dedito »

Dużo można zmienić :)
Zależy co chcesz osiągnąć bo to jest chyba kluczowe w tym wątku.
Awatar użytkownika
Sol-Lex
Posty: 2
Rejestracja: 19 listopada 2024, 13:26
Lokalizacja: śląsk - Będzin

Re: Skrypt aktualizacjia i konserwacja

Post autor: Sol-Lex »

Założeniem było utrzymanie systemu w "dobrej kondycji"
Jednym poleceniem (uruchomienie skryptu) powinno się wykonać:
Sprawdza aktualizacje systemu i flatpak-ów.
Pobiera i instaluje (aktualizuje).
Usuwa niepotrzebne pliki.
Wyświetla na ekranie postęp (tryb gadatliwy).
Zapisuje do plików log, co zrobił.
Usuwa pliki log (500 MB i starszych niż 3 tygodnie).
Dopiero zaczynam zabawę w pisanie skryptów, dlatego chciałem, żeby ktoś rzucił na niego okiem.
Już znalazłem błąd w działaniu skryptu.
w linijce

Kod: Zaznacz cały

flatpak update 2>&1 | tee -a "$LOG_FILE"
powinienem dodać -y, żeby flatpak automatycznie się aktualizował.

Kod: Zaznacz cały

flatpak update -y 2>&1 | tee -a "$LOG_FILE"
Ile jeszcze takich błędów zawiera skrypt?
A może ktoś pomógłby mi w rozbudowaniu i zoptymalizowaniu skryptu.
Chcę mieć system zawsze aktualny, pozbawiony niepotrzebnych śmieci, w dobrej kondycji. :)
Tak wygląda działanie skryptu.
2025-01-02 09:50:25 - === Rozpoczęcie konserwacji systemu ===
2025-01-02 09:50:25 - Pominięto cofanie ostatniej aktualizacji.
2025-01-02 09:50:25 - Aktualizacja listy pakietów za pomocą nala.
Bez zmian: https://dl.google.com/linux/chrome/deb stable InRelease
Bez zmian: http://deb.debian.org/debian bookworm InRelease
Bez zmian: http://security.debian.org/debian-security bookworm-security InRelease
Bez zmian: http://deb.debian.org/debian bookworm-updates InRelease
Bez zmian: http://deb.debian.org/debian bookworm-backports InRelease
Ściągnięte 0 Bytes in 1s (0 bytes/s)
Wszystkie pakiety są aktualne.
2025-01-02 09:50:35 - Aktualizacja systemu za pomocą nala.
Bez zmian: http://security.debian.org/debian-security bookworm-security InRelease
Bez zmian: http://deb.debian.org/debian bookworm InRelease
Bez zmian: http://deb.debian.org/debian bookworm-updates InRelease
Bez zmian: https://dl.google.com/linux/chrome/deb stable InRelease
Bez zmian: http://deb.debian.org/debian bookworm-backports InRelease
Ściągnięte 0 Bytes in 0s (0 bytes/s)
Wszystkie pakiety są aktualne.
2025-01-02 09:50:40 - Aktualizacja pakietów Flatpak.
Wyszukiwanie aktualizacji…

Nie ma nic do zrobienia.
2025-01-02 09:50:41 - Usuwanie nieużywanych pakietów i czyszczenie systemu.
Nala nie ma nic do usunięcia.
Bufor został wyczyszczony
2025-01-02 09:50:44 - Usuwanie nieużywanych Flatpaków.
Nie ma nic nieużywanego do odinstalowania
2025-01-02 09:50:44 - Czyszczenie pamięci podręcznej użytkownika.
2025-01-02 09:50:44 - Czyszczenie logów apt.
2025-01-02 09:50:44 - Optymalizacja logów systemowych.
Vacuuming done, freed 0B of archived journals from /run/log/journal.
Vacuuming done, freed 0B of archived journals from /var/log/journal/111eaf652d9c43ce9b84f5a3e546828d.
Vacuuming done, freed 0B of archived journals from /var/log/journal.
Vacuuming done, freed 0B of archived journals from /run/log/journal.
Vacuuming done, freed 0B of archived journals from /var/log/journal.
Vacuuming done, freed 0B of archived journals from /var/log/journal/111eaf652d9c43ce9b84f5a3e546828d.
2025-01-02 09:50:44 - === Konserwacja systemu zakończona ===
Ostatnio zmieniony 02 stycznia 2025, 10:08 przez Sol-Lex, łącznie zmieniany 2 razy.
Awatar użytkownika
dedito
Moderator
Posty: 3581
Rejestracja: 18 listopada 2013, 21:07
Lokalizacja: Gliwice

Re: Skrypt aktualizacjia i konserwacja

Post autor: dedito »

Jak chcesz rozwijać skrypt pod względem funkcjonalności to dodałbym sobie obsługę dodatkowych opcji, np. poszczególne funkcjonalności zamknąłbym w funkcje podobnie jak w przypadku log_and_print().
Swoją drogą Debian już ma mechanizmy, które dbają o aktualność systemu, więc ten skrypt to w zasadzie tylko inne podejście do tematu.
Awatar użytkownika
Sol-Lex
Posty: 2
Rejestracja: 19 listopada 2024, 13:26
Lokalizacja: śląsk - Będzin

Re: Skrypt aktualizacjia i konserwacja

Post autor: Sol-Lex »

Dzięki za poświęcony czas. :) :)
Wiem, że są narzędzia w Debianie, ale ja lubię bawić się konsolą. :)
Zasugerowany Twoją sugestią pomęczyłem ChatGPT i powstał taki skrypt.

Kod: Zaznacz cały

#!/bin/bash

LOG_FILE="/var/log/konserwacja.log"

# Funkcja logowania z czasem
log() {
    echo "$(date +'%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}

# Funkcja aktualizacji systemu
update_system() {
    log "Aktualizacja list pakietów..."
    if nala update 2>&1 | tee -a "$LOG_FILE"; then
        log "Pomyślnie zaktualizowano listę pakietów."
    else
        log "Błąd podczas aktualizacji listy pakietów."
        return 1
    fi

    log "Aktualizacja systemu..."
    if nala upgrade -y 2>&1 | tee -a "$LOG_FILE"; then
        log "Pomyślnie zaktualizowano system."
    else
        log "Błąd podczas aktualizacji systemu."
        return 1
    fi

    log "Usuwanie niepotrzebnych pakietów..."
    if nala autoremove -y 2>&1 | tee -a "$LOG_FILE"; then
        log "Pomyślnie usunięto niepotrzebne pakiety."
    else
        log "Błąd podczas usuwania niepotrzebnych pakietów."
        return 1
    fi

    log "Czyszczenie pamięci podręcznej pakietów..."
    if nala clean 2>&1 | tee -a "$LOG_FILE"; then
        log "Pomyślnie wyczyszczono pamięć podręczną pakietów."
    else
        log "Błąd podczas czyszczenia pamięci podręcznej pakietów."
        return 1
    fi
}

# Funkcja konserwacji dziennika systemowego
maintain_logs() {
    log "Oczyszczanie dziennika systemowego..."
    if journalctl --vacuum-size=500M 2>&1 | tee -a "$LOG_FILE"; then
        log "Pomyślnie ograniczono rozmiar dziennika systemowego."
    else
        log "Błąd podczas ograniczania rozmiaru dziennika systemowego."
        return 1
    fi

    if journalctl --vacuum-time=3weeks 2>&1 | tee -a "$LOG_FILE"; then
        log "Pomyślnie usunięto stare wpisy dziennika systemowego."
    else
        log "Błąd podczas usuwania starych wpisów dziennika systemowego."
        return 1
    fi
}

# Funkcja konserwacji aplikacji Flatpak
maintain_flatpak() {
    log "Aktualizacja aplikacji Flatpak..."
    if flatpak update -y 2>&1 | tee -a "$LOG_FILE"; then
        log "Pomyślnie zaktualizowano aplikacje Flatpak."
    else
        log "Błąd podczas aktualizacji aplikacji Flatpak."
        return 1
    fi

    log "Usuwanie nieużywanych aplikacji Flatpak..."
    if flatpak uninstall --unused -y 2>&1 | tee -a "$LOG_FILE"; then
        log "Pomyślnie usunięto nieużywane aplikacje Flatpak."
    else
        log "Błąd podczas usuwania nieużywanych aplikacji Flatpak."
        return 1
    fi
}

# Funkcja czyszczenia pamięci podręcznej
clean_cache() {
    log "Czyszczenie pamięci podręcznej użytkownika..."
    if rm -rf ~/.cache/* 2>&1 | tee -a "$LOG_FILE"; then
        log "Pomyślnie wyczyszczono pamięć podręczną użytkownika."
    else
        log "Błąd podczas czyszczenia pamięci podręcznej użytkownika."
        return 1
    fi
}

# Wyświetlanie pomocy
show_help() {
    echo "Użycie: $0 [opcje]"
    echo "Opcje:"
    echo "  --update-system       Aktualizacja systemu i pakietów"
    echo "  --maintain-logs       Konserwacja dziennika systemowego"
    echo "  --maintain-flatpak    Konserwacja aplikacji Flatpak"
    echo "  --clean-cache         Czyszczenie pamięci podręcznej"
    echo "  --all                 Wykonanie wszystkich czynności"
    echo "  --help                Wyświetlenie tej pomocy"
}

# Główna logika skryptu
if [[ $# -eq 0 ]]; then
    show_help
    exit 1
fi

for arg in "$@"; do
    case $arg in
        --update-system)
            update_system
            ;;
        --maintain-logs)
            maintain_logs
            ;;
        --maintain-flatpak)
            maintain_flatpak
            ;;
        --clean-cache)
            clean_cache
            ;;
        --all)
            update_system
            maintain_logs
            maintain_flatpak
            clean_cache
            ;;
        --help)
            show_help
            exit 0
            ;;
        *)
            echo "Nieznana opcja: $arg"
            show_help
            exit 1
            ;;
    esac
done

log "Konserwacja systemu zakończona pomyślnie."
exit 0
Teraz mam możliwość wyboru opcji
Użycie: ./2aktualizacja.sh [opcje]
Opcje:
--update-system Aktualizacja systemu i pakietów
--maintain-logs Konserwacja dziennika systemowego
--maintain-flatpak Konserwacja aplikacji Flatpak
--clean-cache Czyszczenie pamięci podręcznej
--all Wykonanie wszystkich czynności
--help Wyświetlenie tej pomocy
Ostatnio zmieniony 04 stycznia 2025, 08:24 przez Sol-Lex, łącznie zmieniany 2 razy.
Awatar użytkownika
dedito
Moderator
Posty: 3581
Rejestracja: 18 listopada 2013, 21:07
Lokalizacja: Gliwice

Re: Skrypt aktualizacjia i konserwacja

Post autor: dedito »

No teraz to wygląda jak dla mnie już wystarczająco dobrze, pewnie znajdą się jakieś błędy, ale to już w trakcie użytkowania wyjdą i wtedy można jeszcze dodać dla tych przypadków obsługę błędów.
fnmirk
Senior Member
Posty: 8321
Rejestracja: 03 grudnia 2007, 06:37

Re: Skrypt aktualizacjia i konserwacja

Post autor: fnmirk »

Zmieniłbym taki zapis:

Kod: Zaznacz cały

#!/bin/bash
...
na taki:

Kod: Zaznacz cały

#!/bin/sh
...
Eliminując przy okazji tkzw. „baszizmy”, wtedy skrypt będzie bardziej uniwersalny.
Awatar użytkownika
Sol-Lex
Posty: 2
Rejestracja: 19 listopada 2024, 13:26
Lokalizacja: śląsk - Będzin

Re: Skrypt aktualizacjia i konserwacja

Post autor: Sol-Lex »

Zmieniłem skrypt.
Dodałem funkcję umożliwiającą wycofanie ostatniej zmiany, oraz uwzględniając uwagę fnmirk-a.
Teraz skrypt wygląda tak.

Kod: Zaznacz cały

#!/bin/sh

LOG_FILE="/var/log/konserwacja.log"

# Funkcja logowania z czasem
log() {
    echo "$(date +'%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}

# Funkcja aktualizacji systemu
update_system() {
    log "Aktualizacja list pakietów..."
    if nala update 2>&1 | tee -a "$LOG_FILE"; then
        log "Pomyślnie zaktualizowano listę pakietów."
    else
        log "Błąd podczas aktualizacji listy pakietów."
        return 1
    fi

    log "Aktualizacja systemu..."
    if nala upgrade -y 2>&1 | tee -a "$LOG_FILE"; then
        log "Pomyślnie zaktualizowano system."
    else
        log "Błąd podczas aktualizacji systemu."
        return 1
    fi

    log "Usuwanie niepotrzebnych pakietów..."
    if nala autoremove -y 2>&1 | tee -a "$LOG_FILE"; then
        log "Pomyślnie usunięto niepotrzebne pakiety."
    else
        log "Błąd podczas usuwania niepotrzebnych pakietów."
        return 1
    fi

    log "Czyszczenie pamięci podręcznej pakietów..."
    if nala clean 2>&1 | tee -a "$LOG_FILE"; then
        log "Pomyślnie wyczyszczono pamięć podręczną pakietów."
    else
        log "Błąd podczas czyszczenia pamięci podręcznej pakietów."
        return 1
    fi
}

# Funkcja konserwacji dziennika systemowego
maintain_logs() {
    log "Oczyszczanie dziennika systemowego..."
    if journalctl --vacuum-size=500M 2>&1 | tee -a "$LOG_FILE"; then
        log "Pomyślnie ograniczono rozmiar dziennika systemowego."
    else
        log "Błąd podczas ograniczania rozmiaru dziennika systemowego."
        return 1
    fi

    if journalctl --vacuum-time=3weeks 2>&1 | tee -a "$LOG_FILE"; then
        log "Pomyślnie usunięto stare wpisy dziennika systemowego."
    else
        log "Błąd podczas usuwania starych wpisów dziennika systemowego."
        return 1
    fi
}

# Funkcja konserwacji aplikacji Flatpak
maintain_flatpak() {
    log "Aktualizacja aplikacji Flatpak..."
    if flatpak update -y 2>&1 | tee -a "$LOG_FILE"; then
        log "Pomyślnie zaktualizowano aplikacje Flatpak."
    else
        log "Błąd podczas aktualizacji aplikacji Flatpak."
        return 1
    fi

    log "Usuwanie nieużywanych aplikacji Flatpak..."
    if flatpak uninstall --unused -y 2>&1 | tee -a "$LOG_FILE"; then
        log "Pomyślnie usunięto nieużywane aplikacje Flatpak."
    else
        log "Błąd podczas usuwania nieużywanych aplikacji Flatpak."
        return 1
    fi
}

# Funkcja czyszczenia pamięci podręcznej
clean_cache() {
    log "Czyszczenie pamięci podręcznej użytkownika..."
    if rm -rf ~/.cache/* 2>&1 | tee -a "$LOG_FILE"; then
        log "Pomyślnie wyczyszczono pamięć podręczną użytkownika."
    else
        log "Błąd podczas czyszczenia pamięci podręcznej użytkownika."
        return 1
    fi
}

# Funkcja wycofywania ostatniej aktualizacji
undo_last_update() {
    log "Wycofywanie ostatniej aktualizacji..."
    
    # Pobieranie ID ostatniej aktualizacji
    LAST_ID=$(nala history list --reverse | grep -m 1 'upgrade' | awk '{print $1}')
    
    if [[ -z "$LAST_ID" ]]; then
        log "Nie znaleziono żadnej aktualizacji do wycofania."
        return 1
    fi

    # Wycofywanie ostatniej aktualizacji
    if nala history undo "$LAST_ID" 2>&1 | tee -a "$LOG_FILE"; then
        log "Pomyślnie wycofano ostatnią aktualizację (ID: $LAST_ID)."
    else
        log "Błąd podczas wycofywania ostatniej aktualizacji (ID: $LAST_ID)."
        return 1
    fi
}

# Wyświetlanie pomocy
show_help() {
    echo "Użycie: $0 [opcje]"
    echo "Opcje:"
    echo "  --update-system       Aktualizacja systemu i pakietów"
    echo "  --maintain-logs       Konserwacja dziennika systemowego"
    echo "  --maintain-flatpak    Konserwacja aplikacji Flatpak"
    echo "  --clean-cache         Czyszczenie pamięci podręcznej"
    echo "  --undo                Wycofanie ostatniej aktualizacji"
    echo "  --all                 Wykonanie wszystkich czynności"
    echo "  --help                Wyświetlenie tej pomocy"
}

# Główna logika skryptu
if [[ $# -eq 0 ]]; then
    show_help
    exit 1
fi

for arg in "$@"; do
    case $arg in
        --update-system)
            update_system
            ;;
        --maintain-logs)
            maintain_logs
            ;;
        --maintain-flatpak)
            maintain_flatpak
            ;;
        --clean-cache)
            clean_cache
            ;;
        --undo)
            undo_last_update
            ;;
        --all)
            update_system
            maintain_logs
            maintain_flatpak
            clean_cache
            ;;
        --help)
            show_help
            exit 0
            ;;
        *)
            echo "Nieznana opcja: $arg"
            show_help
            exit 1
            ;;
    esac
done

log "Konserwacja systemu zakończona pomyślnie."
exit 0
Awatar użytkownika
dedito
Moderator
Posty: 3581
Rejestracja: 18 listopada 2013, 21:07
Lokalizacja: Gliwice

Re: Skrypt aktualizacjia i konserwacja

Post autor: dedito »

Jak już idziemy w stronę uniwersalności skryptu pod kątem różnych interpreterów to można sobie przeskanować go za pomocą checkbashisms
ODPOWIEDZ