diff options
author | Michael Vogt <mvo@ubuntu.com> | 2016-03-17 08:56:58 +0100 |
---|---|---|
committer | Michael Vogt <mvo@debian.org> | 2016-04-01 13:02:39 +0200 |
commit | 14669d4b95f0f6a9b215d7fa5aebbc3b7198585d (patch) | |
tree | f22ee5dda27ea2a6fb3ee7bf07a553fbb5cd3d41 /debian/apt.apt-compat.cron.daily | |
parent | 6a4958d3134a3a61c036bc9ccaccc393c2bb99f2 (diff) |
Use systemd.timer instead of a cron job
The rational is that we need to spread the load on the mirrors
that apt update and unattended-upgrades cause. To do so, we
leverage the RandomizeDelay feature of systemd. The other advantage
is that the timer is not run at a fixed daily.daily time but
instead every 24h. This also fixes the problem that the randomized
deplay in the current apt.cron.daily causes other cron jobs to
be deplayed.
A compatibility cron job is also provided for systems that do not
use systemd.
Note that the time is fired two times a day, but the logic inside
of apt.systemd.daily will ensure (via stamp files) that the
servers are hit at most every 24h. Firing two times a day helps
with the worst case update time and it also helps with systems
that are not always on.
LP: #246381, #727685
Closes: #600262, #709675, #663290
Diffstat (limited to 'debian/apt.apt-compat.cron.daily')
-rw-r--r-- | debian/apt.apt-compat.cron.daily | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/debian/apt.apt-compat.cron.daily b/debian/apt.apt-compat.cron.daily new file mode 100644 index 000000000..1ea843008 --- /dev/null +++ b/debian/apt.apt-compat.cron.daily @@ -0,0 +1,33 @@ +#!/bin/sh + +set -e + +# Systemd systems use a systemd timer unit which is preferable to +# run. We want to randomize the apt update and unattended-upgrade +# runs as much as possible to avoid hitting the mirrors all at the +# same time. The systemd time is better at this than the fixed +# cron.daily time +if [ -d /run/systemd/system ]; then + exit 0 +fi + +# sleep for a random interval of time (default 30min) +# (some code taken from cron-apt, thanks) +random_sleep() +{ + RandomSleep=1800 + eval $(apt-config shell RandomSleep APT::Periodic::RandomSleep) + if [ $RandomSleep -eq 0 ]; then + return + fi + if [ -z "$RANDOM" ] ; then + # A fix for shells that do not have this bash feature. + RANDOM=$(( $(dd if=/dev/urandom bs=2 count=1 2> /dev/null | cksum | cut -d' ' -f1) % 32767 )) + fi + TIME=$(($RANDOM % $RandomSleep)) + sleep $TIME +} + +# run daily job +random_sleep +exec /usr/lib/apt/apt.systemd.daily |