Skript für apt upgrade

Mirlo

Lt. Junior Grade
Registriert
Feb. 2025
Beiträge
380
Hallo,

ich mag die GUI für das Updaten von Linux nicht sonderlich. Zuletzt ist sie auch hängengeblieben. Besteht die Möglichkeit das in ein Skript zu packen? Wobei ich da spezielle Anforderungen hätte. Es ist bereits einiges dazu im Internet zu finden.

Hier mal ein erster Versuch:
upgrade.sh
Code:
#!/bin/bash
sudo apt-get update
sudo apt-get full-upgrade
sudo apt-get autoremove
sudo apt-get clean
sudo apt-get autoclean
exit

Die upgrade.sh auf dem Desktop speichern.
- ausführbar machen mit
Code:
chmod a+x upgrade.sh
Ausführen durch Doppelklick.

Die speziellen Anforderungen wären (soweit realisierbar):
  • Passworteingabe (erst) im Terminal
  • kein -y, sondern manuelle Eingabe.
  • manuelle Eingabeaufforderung nach jeder Zeile (Enter).
  • zuletzt ein "exit" mit manueller Bestätigung (Enter).
 
@fixedwater fixedwater will wissen von welcher GUI Mirlo spricht, aber das ist ja eh klar, die Standard GUI die mitgeliefert wird, warum fragst du das überhaupt?
 
Mirlo schrieb:
Code:
#!/bin/bash
sudo apt-get update
sudo apt-get full-upgrade
sudo apt-get autoremove
sudo apt-get clean
sudo apt-get autoclean
exit
Also, wenn man es schon so machen möchte, dann richtiger wäre es eher so:
Code:
sudo apt-get update && sudo apt-get full-upgrade && sudo apt-get autoremove && sudo apt-get clean && sudo apt-get autoclean
oder
Code:
#!/usr/bin/env bash
set -e

apt update
apt full-upgrade
apt autoremove
apt autoclean
Finde selbst den Unterschied heraus. ;) Die Zeit läuft.

Und sudo apt-get full-upgrade würde ich nicht machen. Braucht man sehr sehr selten.

Auf meinen Headless-Systemen mache ich es so:
Code:
sudo apt update && sudo apt upgrade -o APT::Get::Always-Include-Phased-Updates=true && sudo apt -y autoremove

-o APT::Get::Always-Include-Phased-Updates=true kann man normalerweise weglassen.

Reicht aus für das, was du da vor hast.
 
Zuletzt bearbeitet:
Und warum dann überhauüt händisch und nicht unattended-upgrades verwenden?

oicfar schrieb:
Und sudo apt-get full-upgrade würde ich nicht machen. Braucht man sehr sehr selten.

Dann mache ich das wohl seit mehr als 10 Jahren falsch, denn ich mache grundsätzlich immer und überall full-upgrade.
 
  • Gefällt mir
Reaktionen: BLACKDIAMONT
CoMo schrieb:
Dann mache ich das wohl seit mehr als 10 Jahren falsch, denn ich mache grundsätzlich immer und überall full-upgrade.
Falsch ist es nicht.

Für den Alltag reicht sudo apt upgrade vollkommen aus. Man sollte aber wissen, was full-upgrade bedeutet, wenn man es benutzt:
  • upgrade = nichts kaputtmachen, nichts entfernen.
  • full-upgrade = System notfalls umbauen, damit wirklich alles aktualisiert werden kann.
Ansonsten: https://unix.stackexchange.com/questions/756169/apt-upgrade-or-apt-full-upgrade
Ergänzung ()

JumpingCat schrieb:
Aufruf dann mit STRG+R + && :-)
Ich mache STRG+R + apt. ;) Aber deine Variante wäre dann eher besser, da bei apt noch andere Vorschläge zuerst kommen könnten.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: JumpingCat
CoMo schrieb:
Und warum dann überhauüt händisch und nicht unattended-upgrades verwenden?
Das ist bei mir aktiv. Das aber aktuallisiert nur bestimmte Pakete.

Ich persönlich ziehe das manuelle Update vor. Da ich so direkt sehe, was upgedated wird und kann es notfalls hinauszögern, wenn ich will.
 
  • Gefällt mir
Reaktionen: Krik
Leute! Ich verstehe gar nichts.

Also alles in eine Zeile und ohne #!/bin/bash, aber mit &&? und dann STRG+R und && ???

Meine Frage betraf auch die Reihenfolge von autoremove, clean und autoclean.
 
Mirlo schrieb:
Leute! Ich verstehe gar nichts.
Wir haben dein Post auch nicht verstanden.
Mirlo schrieb:
Meine Frage betraf auch die Reihenfolge von autoremove, clean und autoclean.
Wer keine Frage stellt, kann auch keine Antwort erwarten. Nur eine "spezielle" Diskussion, wo jeder es besser kann oder auch nicht. ;)

Ja, die Reihenfolge passt schon.
Ergänzung ()

Mirlo schrieb:
Also alles in eine Zeile und ohne #!/bin/bash, aber mit &&? und dann STRG+R und && ???
#!/bin/bash -> cooler ist es mit: #!/usr/bin/env bash

&& -> bedeutet, dass der nächste Befehl nur dann ausgeführt wird, wenn der davor erfolgreich war. Welchen Sinn macht es, wenn in deinem Skript sudo apt update scheitert dann noch sudo apt upgrade auszuführen? Genau: keinen. Statt && kannst du wie ich oben geschrieben habe set -e verwendetn Macht das Gleiche wie &&.

Und mit STRG+R kannst du in der bash nach einem Eintrag in der Bash History suchen.
 
  • Gefällt mir
Reaktionen: JumpingCat
Also das funktioniert schon mal nicht, bzw. nur der erste Befehl und dann schließt das Terminal von alleine:
Code:
sudo apt-get update && sudo apt-get full-upgrade && sudo apt-get autoremove && sudo apt-get clean && sudo apt-get autoclean
Bzw. dass mit dem Passwort erst im Terminal funktioniert.
Fehlt da das #!/bin/bash ?
 
@Mirlo Back to basics.

Wenn du die Zeile in dein bash-Skript übernehmen möchtest, dann muss #!/bin/bash und exit natürlich drin bleiben.

Aber dann kommen wir zum nächsten Problem. Wenn an irgendeinem Schritt es ein Fehler gibt, und du am Ende gleich exit ausführst, dann siehst du nicht, was der Fehler ist.

Variante 1:
Code:
#!/bin/bash

sudo apt-get update &&
sudo apt-get full-upgrade &&
sudo apt-get autoremove &&
sudo apt-get clean &&
sudo apt-get autoclean

status=$?

echo
if [ $status -eq 0 ]; then
    echo "Fertig, alles erfolgreich ausgeführt."
else
    echo "Abbruch wegen eines Fehlers."
fi

read -r -p "Zum Beenden Enter drücken ..."
exit $status

Variante 2:
Code:
#!/bin/bash

echo "Paketlisten aktualisieren..."
sudo apt-get update &&
echo "Upgrade ausführen..."
sudo apt-get full-upgrade &&
echo "Nicht mehr benötigte Pakete entfernen..."
sudo apt-get autoremove &&
echo "Cache bereinigen..."
sudo apt-get clean &&
sudo apt-get autoclean

status=$?

echo
if [ $status -eq 0 ]; then
    echo "Update erfolgreich abgeschlossen."
else
    echo "Fehler: Skript wurde abgebrochen."
fi

read -r -p "Zum Beenden Enter drücken ..."
exit $status

Erklärung:
  • && sorgt dafür, dass der nächste Befehl nur dann läuft, wenn der vorherige erfolgreich war.
  • Sobald ein Befehl fehlschlägt, wird der Rest nicht mehr ausgeführt.
  • status=$? merkt sich den Rückgabewert des letzten ausgeführten Befehls.
  • read -r -p ... wartet auf Enter, damit du die Fehlermeldung noch sehen kannst.
  • exit $status beendet das Skript mit dem passenden Statuscode.
 
  • Gefällt mir
Reaktionen: Mirlo
oicfar schrieb:
Vielen Dank!

Deine Variante 2 ein bisschen abgewandelt ist genau das was ich gesucht habe:
Code:
#!/bin/bash

echo "update"
sudo apt-get update &&
read -r -p "full-upgrade"
sudo apt-get full-upgrade &&
read -r -p "autoremove"
sudo apt-get autoremove &&
read -r -p "clean"
sudo apt-get clean &&
read -r -p "autoclean"
sudo apt-get autoclean

status=$?

echo $status

read -r -p "exit"
exit

// $status liefert 0

Jetzt ist auch zu sehen, warum die vorherige Version das Terminal geschlossen hat und es aussah als wenn das Skript abgebrochen wäre: Das OS ist up to date. Keine Updates vorhanden.
 
  • Gefällt mir
Reaktionen: oicfar
Ich hab mir auch mal ein kleines Skript geschrieben, das das alles durchführt (I use Arch, btw). Das zeigt mir erstmal an, was es an Updates gibt. Falla ich dann Abbreche, stellt es den vorherigen Paket-Datenbank-Stand wieder her, damit der weiterhin zum Stand der installierten Pakete passt.

CoMo schrieb:
Und warum dann überhauüt händisch und nicht unattended-upgrades verwenden?
Weil ich gern schaue, was es Neues gibt. Und weil ich nicht dauernd 100e MB an Paketen installieren will, bloß weil irgend ne lib ein Update bekommen hat.

oicfar schrieb:
Ich mache STRG+R + apt. ;)
Wenn man in der inputrc eine Option aktiviert, die bei debian-Basierten nicht standardmäßig aktiv ist, kann man auch mit Bild auf suchen. Du gibst die ersten Buchstaben ein und dann blättert Bild auf durch alle Zeilen, die damit anfangen. Quasi wie ein selektives Pfeil nach oben.
 
Donnerkind schrieb:
Weil ich gern schaue, was es Neues gibt. Und weil ich nicht dauernd 100e MB an Paketen installieren will, bloß weil irgend ne lib ein Update bekommen hat.
Bibliotheken, die apt installiert sollten bei den restlichen Anwendungen sowieso dynamisch gelinkt sein und entsprechend keine weiteren Updates triggern von Paketen, die die Bibliothek wollen. Wenn da Updates kommen, weil es bei der entsprechenden Software wirklich Änderungen gab.

Zudem, unattended Upgrades, wen juckts, wenn da apt im Hintergrund mit hohem nice Updates zieht und installiert. Das fällt auf den meisten Computern schlicht nicht auf. Nachschauen kannst du auch immer noch, man kann wunderbar Logs schreiben lassen.
 
Piktogramm schrieb:
Bibliotheken, die apt installiert sollten bei den restlichen Anwendungen sowieso dynamisch gelinkt sein und entsprechend keine weiteren Updates triggern von Paketen
Ich nutze wie gesagt Arch. Und da kommt es regelmäßig vor, dass ein ganzer Schwall Pakete mit neuen Distributions-Versionen kommt, aber ohne eigentliches Software-Update. Also Paketname-1.2.3-arch1 wird zu Paketname-1.2.3-arch2. D. h. da wurde irgendeine Lib, gegen die Paketname gebaut ist, aktualisiert, sodass Paketname und alle anderen Pakete, die davon betroffen sind, neu gebaut werden mussten. Und mit solchen Updates warte ich dann halt ein Weilchen, bis sich das wieder lohnt.

Das passiert oft z.B. mit Blender, Libreoffice, manchmal auch TeX (mehrere GB an Downloads und noch mehr GB an entpackter Paketgröße).

Ja, der Rechner kann das im Hintergrund machen, aber ich habe noch die Denke von damals behalten, als ich lahmes Internet und ne lahme Festplatte hatte. Außerdem muss ich dann je nach Paket meine Arbeit unterbrechen und Programme neustarten oder gar KDE abmelden. Eine Besonderheit bei Arch ist auch, dass genau ein Kernel installiert ist. Wenn der aktualisiert wird, löscht pacman den aktuell laufenden, sodass dann z. B. das Mounten von externen Speichermedien nicht mehr geht. Eventuell kann man das besser einrichten, das herauszufinden hab ich mir noch nicht die Mühe gemacht. 😪
 
Je nach Distribution kann man es auch einfach der überlassen...
Bei Linux Mint zum Beispiel einmalig:
Code:
sudo mintupdate-automation upgrade enable
sudo mintupdate-automation autoremove enable
#flatpack and cinnamon-spices autoupdates and Hiding linuxmint updates when not necessary
dconf load /com/linuxmint/updates/ < $config/dconf/linuxmint-updates.conf
Inhalt linuxmint-updates.conf


ansonsten:
Code:
    sudo dpkg-reconfigure -plow unattended-upgrades
    sudo cp -f $config/50unattended-upgrades /etc/apt/apt.conf.d/50unattended-upgrades
Inhalt 50unattended-upgrades
(Würde hier aber Firefox rausnehmen, weil die mittlerweile nachgebessert haben und nicht mehr die Session abschießen, wenn geupdated wurde...)
 
Zurück
Oben