fhxd.de

apt-daily runs every day and updates nothing

2026-04-11

A Debian box that nobody logs into is supposed to look after itself. There is a timer, it fires twice a day, and the service it starts reports success. Here is what that looks like in the journal:

Starting apt-daily.service - Daily apt download activities...
apt-daily.service: Deactivated successfully.
Finished apt-daily.service - Daily apt download activities.

Same second, start to finish. That is the tell. An apt-get update against the Debian mirrors takes several seconds and pulls down tens of megabytes. A service that starts and finishes inside one second did not do it.

Where it goes

apt-daily.service does not run apt-get update unconditionally. It runs apt.systemd.daily, which reads the APT::Periodic::* configuration and decides what, if anything, to do. Every one of those knobs defaults to 0, which means disabled.

apt-config dump | grep -i periodic

If that command prints nothing, or prints all zeroes, the daily job is a very reliable no-op. It will keep being a reliable no-op indefinitely, exiting 0 every time, while the package index quietly ages.

The reason it is off by default is that Debian ships the periodic machinery in apt but the policy in unattended-upgrades, which is not installed on a minimal system. Install the latter and its postinst writes the config that switches the former on. Skip it and you get the timer without the behaviour.

Checking how stale you actually are

The honest measure is the mtime of the package lists, not the timer's last run:

ls -l --time-style=long-iso /var/lib/apt/lists/*_Packages | head

Do not use apt list --upgradable for this. Against a frozen index it cheerfully reports zero upgradable packages, because relative to what it knows about, that is true.

Turning it on

apt-get install unattended-upgrades

# /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "7";

Then confirm it can actually do the work, rather than confirming the unit is enabled:

unattended-upgrade --dry-run --debug

On automatic reboots

Unattended-Upgrade::Automatic-Reboot defaults to false, and on a box whose job is to hold long-lived connections you should leave it false. The cost is that kernel updates install but do not take effect until you reboot by hand, so put that on a calendar. A host running a six-month-old kernel because nobody rebooted is a different failure from one running a six-month-old kernel because nothing ever downloaded it, but the exposure is identical.