
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 travar durante a atualização, instalação, atualização ou dist-upgrade... indefinidamente (depende de você forçá-lo a fechar)
Quando digo travado: ele baixa os arquivos, inicia o download, desacelera e espera em algum momento e simplesmente para de baixar mas ainda aguarda o final do arquivo.
Pelo que entendi, parece ocorrer quando há muitas variações de latência (quando um servidor está saturado ou com acesso à internet wifi/3g)
Este efeito afeta também os repositórios oficiais. então não é uma coisa source.list.
Como podemos saber para apt-get :
- parar de esperar indefinidamente
- tente fazer o download novamente quando houver um tempo limite ou perda de pacote durante o download
Estou procurando uma solução que não envolva métodos de força bruta como Ctrl+ Cou kill. Estou procurando algo mais compatível com scripts (portanto, nenhuma intervenção "humana" quando a linha apt-get for lançada).
Responder1
Você pode usar o timeout
comando (instalado pelo pacote de mesmo nome) para executar um comando e eliminá-lo se demorar mais deNsegundos. Eu teria cuidado sobre quando usá-lo. Matar o apt-get durante a instalação de um pacote pode atrapalhar as coisas, então sugiro apenas executar a parte de download com tempo limite. Algo como 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
}
VerComo executo um comando e ele é abortado (tempo limite) após N segundos?para mais.
Responder2
Aqui está uma atualização generalizada da resposta 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
}