summaryrefslogtreecommitdiff
path: root/debian/apt.apt-compat.cron.daily
diff options
context:
space:
mode:
authorMichael Vogt <mvo@ubuntu.com>2016-03-17 08:56:58 +0100
committerMichael Vogt <mvo@debian.org>2016-04-01 13:02:39 +0200
commit14669d4b95f0f6a9b215d7fa5aebbc3b7198585d (patch)
treef22ee5dda27ea2a6fb3ee7bf07a553fbb5cd3d41 /debian/apt.apt-compat.cron.daily
parent6a4958d3134a3a61c036bc9ccaccc393c2bb99f2 (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.daily33
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