apt-get atualizar status de saída

8

Como verificar o status de apt-get update ?

$ apt-get update ; echo "status is: $?"

Err http://security.debian.org stable/updates Release.gpg
Could not resolve 'security.debian.org'
Hit http://192.168.1.100 stable Release.gpg
Hit http://192.168.1.100 stable Release
Hit http://192.168.1.100 stable/main i386 Packages
Hit http://192.168.1.100 stable/contrib i386 Packages
Hit http://192.168.1.100 stable/non-free i386 Packages
Ign http://192.168.1.100 stable/contrib Translation-en
Ign http://192.168.1.100 stable/main Translation-en
Ign http://192.168.1.100 stable/non-free Translation-en
Reading package lists... Done
W: Failed to fetch http://security.debian.org/dists/stable/updates/Release.gpg  Could not resolve 'security.debian.org'
W: Some index files failed to download. They have been ignored, or old ones used instead.

status is: 0

Aqui há um erro com a busca de atualizações de segurança, mas o status de saída é 0

Meu objetivo é um script para verificar se o apt-get update é executado corretamente.

    
por Pol Hallen 20.12.2014 / 12:54

3 respostas

6

No seu exemplo apt-get update não saiu com erro, porque considerava os problemas como avisos, não como fatalmente ruins. Se houver um erro realmente fatal, ele sairá com um status diferente de zero.

Uma forma de reconhecer anomalias é verificando esses padrões em stderr :

  • As linhas que começam com W: são avisos
  • Linhas começando com E: são erros

Você poderia usar algo assim para emular uma falha caso os padrões acima correspondam ou o código de saída de apt-get update em si seja diferente de zero:

if ! { sudo apt-get update 2>&1 || echo E: update failed; } | grep -q '^[WE]:'; then
    echo success
else
    echo failure
fi

Observe o ! no if . É porque o grep sai com sucesso se o padrão foi correspondido, isto é, se houve erros. Quando não houver erros, o grep falhará. Portanto, a condição if é negar o código de saída do grep .

    
por 20.12.2014 / 13:09
1

Se você quiser que o apt-get's / err não seja comido (por exemplo, ao gravar em um arquivo de log), isso pode ser uma alternativa mais simples:

sudo apt-get update 2>&1 | tee /tmp/apt.err && ! grep -q '^[WE]' /tmp/apt.err

Seria bom se isso não deixasse um novo arquivo disponível para ser removido mais tarde, mas se, digamos, processarmos o substituto do grep na saída do tee, será mais difícil obter o código de saída.

    
por 18.02.2016 / 18:05
0

Eu enfrentei o mesmo problema e gostaria de propor outra solução que dependa de tee (como a solução @ user4122451), mas não cria um arquivo temporário e também falha se sudo apt-get update retornar um código de saída diferente de zero sem gerar uma W: ou E: ou Err: string:

exec {fd}>&2 # copy stderr to some unused fd
bash -o pipefail -c "sudo apt-get update -y -q 2>&1 | tee /dev/fd/$fd | ( ! grep -q -e '^Err:' -e '^[WE]:' )"
result=$?
exec {fd}>&- # close file descriptor

Especificamente, essa solução se baseia na set -o pipefail bash (garantia de que pipeline retorna o valor do comando mais à direita para sair com um status diferente de zero, caso contrário, zero) e usa um descritor de arquivo numerado adicional (consulte também este Então responda ).

Se você não precisa tornar a opção pipefail local, também pode escrever:

set -o pipefail
exec {fd}>&2 # copy stderr to some unused fd
sudo apt-get update -y -q 2>&1 | tee /dev/fd/$fd | ( ! grep -q -e '^Err:' -e '^[WE]:' )
result=$?
exec {fd}>&- # close file descriptor
    
por 13.08.2018 / 14:29

Tags