1

У меня действительно странная проблема. Я расширяю установщик ОС для Raspberry Pi. Я настраиваю его на автоматическую загрузку после того, как установщик выполняет свою работу, и запускаю мой скрипт, который выполняет оставшуюся установку. Но иногда я хочу переустановить свои дополнения без переустановки всей ОС. Итак, у меня есть скрипт с именем on-first-login.sh примерно такой:

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

git clone git@github.com:me/my-repo.git ~/my-repo

Теперь вот действительно странная часть. Вышеуказанное работает только тогда, когда нужно установить git или если я изменил скрипт на этот:

apt-get install git -y

git clone git@github.com:me/my-repo.git ~/my-repo

В противном случае я получаю эту ошибку:

ssh: не удалось разрешить имя хоста github.com: имя или служба неизвестны

Я действительно хочу решить эту проблему, в основном из принципа, но также во избежание вызова apt-get install git -y потому что это занимает около 5 секунд (если git уже установлен), что немного неприятно.

Я попытался заставить скрипт ждать успешного пинга следующим образом:

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 git@github.com:me/my-repo.git ~/my-repo

Но это повторяется до бесконечности.

Что на земле происходит? Кажется, apt-get install делает что-то особенное, и я хотел бы знать, что именно.

1 ответ1

2

Как вы уже поняли, ваш git clone вызывается до того, как ваше сетевое соединение полностью установится. Единственное волшебство, которое, вероятно, делает apt-get , заключается в том, что для запроса локальной базы данных пакетов требуется немного времени. Это дает сети достаточно времени для включения и настройки.

Причина, по которой ваш второй скрипт не работает должным образом, заключается в том, что вы путаете коды возврата программы. В bash или shell в общем случае число ноль представляет собой ИСТИННОЕ логическое значение. Программа, которая успешно завершает работу, должна возвращать ноль. Таким образом, если ваш пинг (и grep) завершится успешно, вы получите нулевое возвращаемое значение, а while 0 будет повторяться бесконечно.

Кроме того, вы получаете возвращаемое значение команды grep вместо того, чтобы удобно использовать ping напрямую. Попробуйте этот скрипт вместо:

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 git@github.com:me/my-repo.git ~/my-repo

Чтобы увеличить многословность, удалите перенаправление вывода из ping.

Полагаю, это очевидное предупреждение, но безопасность ваших настроек выглядит подозрительно - вы автоматически скачиваете вещи из git с учетной записью root ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .