"apt-get"이 멈추는 것을 방지하는 방법은 무엇입니까?

"apt-get"이 멈추는 것을 방지하는 방법은 무엇입니까?

다음과 같은 일부 조건에서는:

  • 느린 인터넷 연결
  • 느린 PPA 또는 소스
  • Wi-Fi 인터넷 접속 또는 3G 인터넷 접속

업데이트, 설치, 업그레이드 또는 dist-upgrade 중에 apt-get이 중단될 수 있습니다.... 끝없이(강제 종료 여부는 사용자에게 달려 있음)

내가 멈췄다고 말하면 파일을 다운로드하고, 다운로드를 시작하고, 속도를 늦추고 어느 시점에서 기다렸다가 다운로드를 중지하지만 여전히 파일의 끝을 기다리고 있습니다.

내가 이해한 바로는 지연 시간의 변화가 많을 때(즉, 서버가 포화 상태이거나 Wi-Fi/3g 인터넷 액세스가 가능한 경우) 이 문제가 발생하는 것 같습니다.

이 효과는 공식 저장소에도 영향을 미칩니다. 그래서 그것은 source.list가 아닙니다.

apt-get에 대해 어떻게 알 수 있습니까?

  1. 끝없이 기다리지 말라고
  2. 다운로드 중 시간 초과 또는 패킷 손실이 발생하면 다운로드를 다시 시도하세요.

Ctrl+ C또는 kill과 같은 무차별 대입 방법을 포함하지 않는 솔루션을 찾고 있습니다 . 나는 스크립트와 더 호환되는 것을 찾고 있습니다(따라서 apt-get 라인이 시작될 때 "사람"의 개입이 없습니다).

답변1

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초 후에 중단(시간 초과)되도록 하려면 어떻게 해야 합니까?이상.

답변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
}

관련 정보