O que o 'apt-get install' faz no modo de esperar pela conexão com a internet?

1

Eu tenho um problema muito estranho. Estou estendendo um instalador do SO para o Raspberry Pi . Eu configurá-lo para auto-boot depois que o instalador faz suas coisas e executar o meu script que faz a instalação restante. Mas às vezes eu quero reinstalar minhas adições sem reinstalar o sistema operacional inteiro. Então eu tenho um script chamado on-first-login.sh com algo parecido com isto:

if [ $(command -v git) ]; then
    echo "Git already installed."
else
    apt-get install git -y
fi

git clone [email protected]:me/my-repo.git ~/my-repo

Agora aqui está a parte realmente estranha. O acima só funciona quando o git precisa ser instalado, ou se eu mudar o script para isso:

apt-get install git -y

git clone [email protected]:me/my-repo.git ~/my-repo

Caso contrário, recebo este erro:

ssh: Could not resolve hostname github.com: Name or service not known

Eu realmente quero resolver isso, principalmente por princípio, mas também para evitar chamar apt-get install git -y porque leva cerca de 5 segundos (se o git já estiver instalado) o que é um pouco doloroso.

Eu tentei fazer o script esperar por um ping bem-sucedido da seguinte forma:

if [ $(command -v git) ]; then
    echo "Git already installed."
else
    apt-get install git -y
fi

pingerr=1
while [ $pingerr ]; do
    sleep 1
    ping -c 1 github.com | grep "1 received"
    pingerr=$?
    if [ $pingerr ]; then
      echo "Could not ping github. Retrying..."
    else
      echo "Successfully pinged github"
    fi
done

git clone [email protected]:me/my-repo.git ~/my-repo

Mas apenas tenta indefinidamente.

O que diabos está acontecendo? Parece que apt-get install está fazendo algo especial e adoraria saber o quê.

    
por Jodes 10.10.2016 / 16:53

1 resposta

2

Como você já descobriu, seu git clone é chamado antes que sua conexão de rede esteja totalmente ativada. A única mágica que apt-get provavelmente faz é demorar um pouco para consultar o banco de dados de pacotes local. Isso está dando tempo suficiente para que a rede seja ativada e configurada.

A razão pela qual seu segundo script não se comporta adequadamente é porque você está confundindo os códigos de retorno do programa. No bash, ou shell em geral, o número zero representa o valor booleano TRUE. Um programa que sai com êxito deve retornar o número zero. Assim, se seu ping (e grep) for bem-sucedido, você receberá zero valor de retorno e while 0 fará um loop para sempre.

Além disso, você está pegando o valor de retorno do comando grep em vez de convenientemente usar ping diretamente. Experimente este script:

retries=0
while ! ping -c1 github.com >/dev/null 2>&1; do
    sleep 1
    if (( retries++ > 10 )); then
        echo "Max retries reached, aborting." >&2
        exit 1
    fi
done

git clone [email protected]:me/my-repo.git ~/my-repo

Para aumentar o detalhamento, remova o redirecionamento de saída do ping.

Eu acho que isso é um aviso óbvio, mas a segurança da sua configuração parece suspeita - você está baixando automaticamente as coisas do git com conta root ...

    
por 10.10.2016 / 17:57

Tags