毎日ではなく数時間ごとに無人アップグレードを実行する方法

毎日ではなく数時間ごとに無人アップグレードを実行する方法

基本的に無人アップグレードcron.dailyで最大毎日実行されます。攻撃者にはこの操作に時間がかかる可能性があります。 4時間ごとに実行したいのですが、どうすればいいですか?

答え1

無人アップグレードの頻度は、次の2つのステップで決定されます。

  1. システムスケジューラ(例:systemdタイマーまたはcron / anacron)と
  2. APT::周期的な厚さ。

1つの低い周波数がもう1つの高い周波数をブロックするので、正しく設定されていることを確認してください。両方スピード。

2番目のステップ(APT ::定期的な間隔)には、aptバージョン1.5以降が必要で、毎日より頻繁に実行されます。 Debian 10(buster) には apt 1.8.2 が含まれているので問題はありません。

Debian 9(stretch)など、1.5未満の適切なバージョンを使用している場合は、2番目のステップで問題が発生します。ステップ1を始める前に、この回答の一番下までスクロールして、ここで提案されている見苦しい解決策を適用することを確認してください。

また、一般的な使用法と同様に、aptおよび/の間にも違いがあります。 1つ目は利用可能なパッケージリストの更新に関するもので、2つ目はパッケージのアップグレードに関するものです。もう一度、両方の設定を変更する必要があります。updateupgradeinstall

1. システムスケジューラ

Debian 9(stretch)とDebian 10(buster)では、プロセスは次の2つのsystemdタイマーによって開始されます。

  • apt-daily.timer、UpdatePackageList()をapt-daily.service呼び出して/usr/lib/apt/apt.systemd.daily updateapt-get update
  • apt-daily-upgrade.timer、()をapt-daily-upgrade.service呼び出して/usr/lib/apt/apt.systemd.daily installアップグレードをインストールしますunattended-upgrade

(anacronジョブは/etc/cron.daily/apt-compatまだ存在しますが、systemdが検出された場合は終了します。systemdが存在しない場合は/usr/lib/apt/apt.systemd.dailyサブコマンドなしで実行されます。これをupdate意味します。systemdinstallを使用していない場合は、他の回答や計画の変更を参照してください。anacronマニュアル。)

デフォルトのスケジュールを上書きして、システムタイマーをより頻繁に実行するように設定できます(4時間ごとなど)。まず、パッケージリストを更新します。

$ sudo systemctl edit apt-daily.timer

このように作成されました/etc/systemd/system/apt-daily.timer.d/override.conf。以下を入力してください。

[Timer]
OnCalendar=
OnCalendar=*-*-* 0,4,8,12,16,20:00
RandomizedDelaySec=15m

その後、20分後に実際のアップグレードを実行します。

$ sudo systemctl edit apt-daily-upgrade.timer

[Timer]
OnCalendar=
OnCalendar=*-*-* 0,4,8,12,16,20:20
RandomizedDelaySec=1m

作業内容を確認してください。

$ systemctl cat apt-daily{,-upgrade}.timer
$ systemctl --all list-timers apt-daily{,-upgrade}.timer

(一部抜粋Debian Wiki: 無人アップグレード.)

2. APT::定期的な厚さ

システムスケジューラは/usr/lib/apt/apt.systemd.dailyファイルスタンピングメカニズムを使用して、要求されたジョブが最後に実行されたタイミングを確認するスクリプトを呼び出します。そのジョブのAPT::Periodicで設定された間隔と比較します。通常、次のような設定があります/etc/apt/apt.conf.d/20auto-upgrades

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

私はいつも"1"ここの値がTrueまたはOnを意味すると思いましたが、実際には1日単位で表される実行間の最小間隔です。スクリプトが要求された操作が最後に実行されてから経過した時間が少ないと判断した場合は、いいえシステムスケジューラが必要とするかどうかにかかわらず、これを行います。

apt 1.5〜beta2では、Paul Wiseはサフィックスまたはを追加して間隔を秒、分、時間単位で定義できるため、smのようにh変更できます/etc/apt/apt.conf.d/20auto-upgrades

APT::Periodic::Update-Package-Lists "3h";
APT::Periodic::Unattended-Upgrade "3h";

(より小さい場合は、"4h"システムスケジューラのランダム遅延を考慮します。)

より良いことは、間隔を次のように設定できることです。"always"最後の実行以降に時間が経過したかどうかに関係なく、要求された場合にのみタスクが実行されることを確認してください。

APT::Periodic::Update-Package-Lists "always";
APT::Periodic::Unattended-Upgrade "always";

一度設定してから頻度を変更したい場合は、システムスケジューラ(システムタイマー)と対話する必要があるため、この方法をお勧めします。

<1.5に適合

Debian 9(stretch) は apt 1.4.9 に付属しているため、APT::Periodic 間隔を に設定し"always"たり、"3h"手順 2 で説明した方法は動作しません。ところで、数日の空白"0.1"も動作しません。

醜い回避策が気に入らない場合は、/usr/lib/apt/apt.systemd.dailyタイムスタンプメカニズムを関数に挿入して除外するようにスクリプトを編集してください(ユーザーの責任はユーザーにあります)。return 0check_stamp()

--- a/lib/apt/apt.systemd.daily
+++ b/lib/apt/apt.systemd.daily
@@ -82,10 +82,12 @@ check_stamp()
        debug_echo "check_stamp: interval=0"
        # treat as no time has passed
         return 1
     fi

+    return 0
+
     if [ ! -f $stamp ]; then
        debug_echo "check_stamp: missing time stamp file: $stamp."
        # treat as enough time has passed
         return 0
     fi

これにより、スクリプトは常に間隔が経過したと思われるため、要求されたすべてのタスクを実行します。 aptをアップグレードするときは、この回避策を上書きする必要があり、その後、上記"always"の2段階の方法を使用するように切り替えることができます。

スクリプトをめちゃくちゃにしたくない場合は、他の回答で述べたようにカスタムクローン操作を検討してください。この場合、この回答のステップ1についても心配する必要はありません。

答え2

古い質問ですが、私と同じ問題を抱えている人のために:

Ubuntu 16.04(および他のシステムシステム)では、自動アップグレードはcronによってトリガされなくなりました。代わりにシステムタイマーを使用してください。

ランタイムとランダムな遅延を修正するには、タイマーを修正/オーバーライドする必要があります。詳細はこちらからご覧いただけます。 https://github.com/systemd/systemd/issues/3233

答え3

Krzysztofが指摘したように、これには別のcronエントリが必要です。

パッケージブラックリスト/ホワイトリスト、再起動、およびその他の詳細が適切に処理されるようにするには、直接呼び出すことをお勧めしますunattended-upgrade(Pythonスクリプト)。

たとえば、

echo "0 0-23/4 * * * root sleep $(( $RANDOM % 14400 ));PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin unattended-upgrade" > /etc/cron.d/unattended-upgrade

これはで設定された期間を上書きします/etc/apt/apt.conf.d/。これは、これらのチェックがunattended-upgradeスクリプト内で実行されるのではなく、呼び出しスクリプトより1レベル上で実行されるために機能します/usr/lib/apt/apt.systemd.daily

出力は/var/log/unattended-upgrades/通常通り記録されます。

答え4

無人アップグレードスクリプトは/etc/cron.daily/apt日単位のアップグレード間隔を使用するため、頻度を1日以上設定することはできません。

標準のcronが利用可能です。以下を入力してください/etc/cron.d

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
0 0-23/4 * * * root   apt-get -q update && apt-get dist-upgrade -yq -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold"

必要に応じてコマンドを調整します。

関連情報