Как избежать зависания «apt-get»?

Как избежать зависания «apt-get»?

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

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

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

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

Насколько я понимаю, это происходит, когда наблюдается много изменений задержки (например, когда сервер перегружен или имеется доступ к Интернету через Wi-Fi/3G).

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

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

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

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

решение1

Вы можете использовать timeoutкоманду (устанавливается пакетом с тем же именем) для запуска команды и ее завершения, если она занимает больше времени, чемНсекунд. Я бы был осторожен, когда его использовать. Уничтожение 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 секунд?для большего.

решение2

Вот обобщенное обновление ответа @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
}

Связанный контент