Как избежать & ldquo; apt-get & ldquo; застрять?

В некоторых условиях, таких как:

  • Медленные интернет-соединения
  • Медленный PPA или источники
  • Wi-Fi или 3G-доступ в интернет

apt-get может застрять во время обновления, установки, обновления или dist-upgrade .... бесконечно (до вас, чтобы заставить его закрыться)

Когда я говорю, застрял: он загружает файлы, запускается загрузка, замедление и ожидание в некоторый момент и просто остановка для загрузки, но все еще ждет конец файла.

Из того, что я понимаю, кажется, что это происходит, когда существует много вариаций задержки (поэтому, когда сервер насыщен или имеет доступ к Wi-Fi / 3g Интернету)

Этот эффект также влияет на официальные репозитории. так что это не источник.списка.

Как мы можем сказать apt-get:

  1. прекратить бесконечное ожидание
  2. повторить попытку загрузки, когда во время загрузки произошел тайм-аут или потеря пакета
  3. [ 115]

    Я ищу решение, которое не включает методы грубой силы, такие как Ctrl + C или kill. Я ищу что-то более совместимое со сценариями (так что никакого «человеческого» вмешательства, когда была запущена строка apt-get).

4
задан 11 April 2015 в 23:22

2 ответа

Вы можете использовать команду timeout (установленную пакетом с тем же именем), чтобы запустить команду и убить ее, если это займет более N секунд. Я был бы осторожен о том, когда использовать это все же. Убийство apt-get во время установки пакета может привести к путанице, поэтому я советую запускать только часть загрузки с таймаутом. Что-то вроде этой функции 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
}

См. Как запустить команду и сделать так, чтобы она прервалась (время ожидания) через N секунд? , чтобы узнать больше.

0
ответ дан 11 April 2015 в 23:22

Вот обобщенное обновление ответа @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
}
0
ответ дан 11 April 2015 в 23:22

Другие вопросы по тегам:

Похожие вопросы: