「apt-get」が停止するのを回避するにはどうすればいいですか?

「apt-get」が停止するのを回避するにはどうすればいいですか?

次のような状況では:

  • インターネット接続が遅い
  • 遅いPPAまたはソース
  • Wi-Fiインターネットアクセスまたは3Gインターネットアクセス

apt-get は、更新、インストール、アップグレード、または dist-grade 中に停止する場合があります。無限に続きます (強制終了するかどうかはユーザー次第です)

停止というのは、ファイルをダウンロードし、ダウンロードを開始し、ある時点で速度を落として待機し、ダウンロードを停止しますが、ファイルの終わりを待機し続けます。

私の理解では、レイテンシの変動が大きい場合(サーバーが飽和状態の場合や、Wi-Fi/3Gインターネット接続の場合)に発生するようです。

この効果は公式リポジトリにも影響します。したがって、source.list の問題ではありません。

apt-get に次のように指示するには:

  1. いつまでも待つのをやめる
  2. ダウンロード中にタイムアウトまたはパケット損失が発生した場合にダウンロードを再試行します

Ctrl私は、 +や killなどのブルート フォース メソッドを必要としないソリューションを探していますC。スクリプトとより互換性のあるソリューション (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
}

関連情報