
Unter bestimmten Bedingungen wie diesen:
- Langsame Internetverbindungen
- Langsames PPA oder Quellen
- WLAN-Internetzugang oder 3G-Internetzugang
apt-get bleibt möglicherweise während der Aktualisierung, Installation, des Upgrades oder des Dist-Upgrades hängen... endlos (Sie müssen es zum Schließen zwingen)
Wenn ich sage, es steckt fest, dann lädt es die Dateien herunter, startet den Download, wird langsamer und wartet an einem bestimmten Punkt und stoppt den Download einfach, wartet aber weiterhin auf das Ende der Datei.
So wie ich es verstehe, tritt es auf, wenn es viele Latenzschwankungen gibt (also wenn ein Server ausgelastet ist oder wenn ein WLAN-/3G-Internetzugang besteht).
Dieser Effekt betrifft auch offizielle Repositories. Es ist also keine Sache der Quellliste.
Wie können wir apt-get Folgendes mitteilen:
- aufhören, endlos zu warten
- erneuter Downloadversuch, wenn während des Downloads eine Zeitüberschreitung oder ein Paketverlust auftritt
Ich suche nach einer Lösung, die keine Brute-Force-Methoden wie Ctrl+ Coder kill beinhaltet. Ich suche nach etwas, das Skripte besser unterstützt (also kein „menschliches“ Eingreifen nach dem Start der apt-get-Zeile).
Antwort1
timeout
Mit dem Befehl (der durch das gleichnamige Paket installiert wird) können Sie einen Befehl ausführen und beenden, wenn er länger dauert alsNSekunden. Ich wäre jedoch vorsichtig, wann ich es verwende. Das Beenden von apt-get während einer Paketinstallation könnte alles durcheinander bringen, daher schlage ich vor, nur den Download-Teil mit Timeout auszuführen. So etwas wie diese Bash-Funktion:
upgrade() {
local retry=5 count=0
# retry at most $retry times, waiting 1 minute between each try
while true; do
# Tell apt-get to only download packages for upgrade, and send
# signal 15 (SIGTERM) if it takes more than 10 minutes
if timeout -15 600 apt-get --assume-yes --download-only upgrade; then
break
fi
if (( count++ == retry )); then
printf 'Upgrade failed\n' >&2
return 1
fi
sleep 60
done
# At this point there should be no more packages to download, so
# install them.
apt-get --assume-yes upgrade
}
SehenWie führe ich einen Befehl aus und lasse ihn nach N Sekunden abbrechen (Timeout)?für mehr.
Antwort2
Hier ist ein allgemeines Update zu @geirhas Antwort.
############ wrapper over apt-get to download files (retries if download fails) and then perform action.
############ usage example: aptgethelper install "nethogs rar -y -qq --force-yes"
function aptgethelper(){
local __cmd=$1
local __args=$2
local retry=10 count=0
set +x
# retry at most $retry times, waiting 1 minute between each try
while true; do
# Tell apt-get to only download packages for upgrade, and send
# signal 15 (SIGTERM) if it takes more than 10 minutes
if timeout --kill-after=60 60 apt-get -d $__cmd --assume-yes $__args; then
break
fi
if (( count++ == retry )); then
printf "apt-get download failed for $__cmd , $__args\n" >&2
return 1
fi
sleep 60
done
# At this point there should be no more packages to download, so
# install them.
apt-get $__cmd --assume-yes $__args
}