如何避免“apt-get”卡住?

如何避免“apt-get”卡住?

在某些情况下,例如:

  • 网络连接速度慢
  • PPA 或资源缓慢
  • 无线网络或3G网络

apt-get 可能会在更新、安装、升级或 dist-upgrade 期间卡住....无休止(由您强制关闭)

当我说卡住时:它会下载文件,开始下载,减慢速度并在某个时候等待,然后停止下载,但仍在等待文件的结束。

据我所知,这种情况似乎发生在延迟变化很大的时候(即当服务器饱和或有 wifi/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
}

相关内容