Como evitar que o “apt-get” fique preso?

4

Em algumas condições como essas:

  • Conexões de internet lentas
  • PPA ou fontes lentas
  • Acesso à internet Wi-Fi ou acesso à internet 3g

O apt-get pode ficar preso durante a atualização, instalação, atualização ou dist-upgrade .... infinitamente (até você para forçá-lo a fechar)

Quando digo "preso": ele baixa os arquivos, inicia o download, diminui a velocidade e espera em algum momento e simplesmente pára para fazer o download, mas ainda espera o final do arquivo.

Pelo que entendi, parece ocorrer quando há muitas variações de latência (assim, quando um servidor está saturado ou com um acesso à internet wifi / 3g)

Esse efeito também afeta os repositórios oficiais. então não é uma coisa de source.list.

Como podemos dizer ao apt-get:

  1. para parar de esperar indefinidamente
  2. tente fazer o download novamente quando houver um tempo limite ou uma perda de pacotes durante o download

Eu estou procurando uma solução que não envolva métodos de força bruta como Ctrl + C ou kill. Eu estou procurando por algo mais compatível com scripts (então nenhuma intervenção "humana" quando a linha apt-get foi lançada).

    
por Antoine Rodriguez 17.03.2012 / 15:36

2 respostas

5

Você pode usar o comando timeout (instalado pelo pacote com o mesmo nome) para executar um comando e eliminá-lo se demorar mais do que N segundos. Eu teria cuidado sobre quando usá-lo embora. Matar o apt-get durante uma instalação de pacotes pode atrapalhar as coisas, então sugiro apenas executar a parte de download com o tempo limite. Algo parecido com esta função 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
}

Veja Como faço para executar um comando e abortar (tempo limite) após N segundos? para mais.

    
por geirha 17.03.2012 / 21:40
0

Aqui está uma atualização generalizada para a resposta do @ 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
}
    
por JasonS 11.04.2015 / 20:37