¿Cómo evitar que "apt-get" se atasque?

¿Cómo evitar que "apt-get" se atasque?

En algunas condiciones como esas:

  • Conexiones lentas a Internet
  • PPA o fuentes lentas
  • Acceso a internet wifi o acceso a internet 3g

apt-get puede bloquearse durante la actualización, instalación, actualización o dist-upgrade.... infinitamente (depende de usted forzar su cierre)

Cuando digo atascado: descarga los archivos, inicia la descarga, disminuye la velocidad y espera en algún momento y simplemente se detiene para descargar pero aún espera el final del archivo.

Por lo que tengo entendido, parece ocurrir cuando hay muchas variaciones de latencia (por ejemplo, cuando un servidor está saturado o con acceso a Internet wifi/3g)

Este efecto afecta también a los repositorios oficiales. entonces no es una cosa de source.list.

¿Cómo podemos saber apt-get:

  1. dejar de esperar sin cesar
  2. Vuelva a intentar descargar cuando haya un tiempo de espera o una pérdida de paquete durante la descarga.

Estoy buscando una solución que no implique métodos de fuerza bruta como Ctrl+ Co kill. Estoy buscando algo más compatible con los scripts (por lo que no hay intervención "humana" cuando se lanza la línea apt-get).

Respuesta1

Puede usar el timeoutcomando (instalado por el paquete con el mismo nombre) para ejecutar un comando y eliminarlo si tarda más denortesegundos. Aunque tendré cuidado sobre cuándo usarlo. Eliminar apt-get durante la instalación de un paquete podría estropear las cosas, por lo que sugiero ejecutar solo la parte de descarga con tiempo de espera. Algo como esta función bash:

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
}

Ver¿Cómo ejecuto un comando y hago que se cancele (tiempo de espera) después de N segundos?para más.

Respuesta2

Aquí hay una actualización generalizada de la respuesta de @geirha.

############ 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
}

información relacionada