78

Currently, to get things up to date on my Raspberry Pi, I have to type in sudo apt-get update and sudo apt-get upgrade. Is there a way to set it up to automatically do this? I am running Raspbian Jessie.

4 Answers 4

73

Instead of a manual cron, you can install unattended-upgrades, which is useful to ensure the latest kernels are installed. It's mostly designed for security.

apt-get install unattended-upgrades

There are some bits that can be adjusted/configured, but the default is fine.

4
  • 15
    For me, the default was not fine. It didn't do anything: the /var/log/unattended-upgrades/unattended-upgrades.logfile reported Allowed origins are: []so basically it wasn't pulling any updates in. After updating /etc/apt/apt.conf.d/50unattended-upgrades to include "origin=Raspbian,codename=${distro_codename},label=Raspbian";updates started to come in. Commented May 18, 2017 at 20:10
  • My bone stock (as of September 2017) 50unattended-upgrades lists "origin=Debian,codename=${distro_codename},label=Debian-Security"; and it appears to find relevant packages correctly. Of course it ignores many of them. I've not set up any white or blacklists.
    – Jon V
    Commented Sep 15, 2017 at 13:11
  • 20
    The default 50unattended-upgrades is indeed stupid and has to be changed for this to work on Raspian. There is no Raspian-Security. Security updates are not labeled. It is important to add both "origin=Raspbian,codename=${distro_codename},label=Raspbian"; and "origin=Raspberry Pi Foundation,codename=${distro_codename},label=Raspberry Pi Foundation"; to /etc/apt/apt.conf.d/50unattended-upgrades
    – user643011
    Commented Apr 8, 2018 at 0:37
  • 4
    I would just like to clarify that I should add those lines, not replace "origin=Debian,codename=${distro_codename},label=Debian"; and "origin=Debian,codename=${distro_codename},label=Debian-Security"; with the new lines?
    – lindhe
    Commented Oct 3, 2020 at 9:13
44

In its default configuration, unattended-upgrades is broken in Raspbian Buster. It won't install crucial updates for the kernel and other software. Your options are:

Recommended Option:

sudo apt install unattended-upgrades

echo 'Unattended-Upgrade::Origins-Pattern {
//      Fix missing Rasbian sources.
        "origin=Debian,codename=${distro_codename},label=Debian";
        "origin=Debian,codename=${distro_codename},label=Debian-Security";
        "origin=Raspbian,codename=${distro_codename},label=Raspbian";
        "origin=Raspberry Pi Foundation,codename=${distro_codename},label=Raspberry Pi Foundation";
};' | sudo tee /etc/apt/apt.conf.d/51unattended-upgrades-raspbian

For faster security updates (but less stability, as the packages haven't been approved for rasbian), you can add debian-security packages to apt:

echo 'deb http://deb.debian.org/debian-security/ buster/updates main contrib non-free' | sudo tee /etc/apt/sources.list.d/debian-security.list

You will probably need to install new apt keys for the debian repository.

Other Options:

  • Work around it with by using cron-apt: sudo apt install cron-apt

It's recommended to use unattended-updates and fix the package, because it's best suited for the purpose. Cron-apt is your second-best option, because it's also designed for a similar purpose. I'm not sure cron-apt can automatically reboot your system after a kernel update. Unattended-upgrades has that option, and in my experience reboot after kernel upgrade works with the fix above.

2
  • 1
    For future reference: the correct values to use for Unattended-Upgrade::Origins-Pattern's keywords (e.g. origin, label, etc.) can be found in the output of apt-cache policy.
    – Flux
    Commented Nov 16, 2021 at 14:53
  • Final step to enable unattended-upgrades so it automatically runs on your system, type: sudo dpkg-reconfigure --priority=low unattended-upgrades
    – HackSlash
    Commented Jan 24 at 21:52
33

Tasks can be automated using the cron utility.

To setup cron to update apt, in a terminal type:

sudo su

to access a root-level prompt. Then, run:

crontab -e

to begin editing your crontab, a table of tasks to run automatically at a given time. It will open in your preferred text editor. Modify it to include the following line:

0 7 * * 1 apt update && apt upgrade -y

This will tell the system to automatically update and upgrade your apps at 7AM every Monday. After saving and exiting, it is now activated, no further actions. Read-up on crontab to see how to adjust to your liking.

Note time trigger "0 7 * * 1" translates to 0 hours past 7 every day of every month that is a Monday. To help with changing the trigger, you can use https://cron.help.

7
  • 4
    it's probably better to put the commands on the same line with && since they are related and there's no reason to do 'upgrade' if 'update' fails. Commented Dec 5, 2015 at 2:36
  • 7
    dist-upgrade is better than upgrade, you will end up with broken dependencies using only upgrade. You also won't get around updates that require dialog confirmations. @tedder42 pointed out the method preferred by Debian (using unattended-upgrades). Commented Jan 31, 2016 at 18:51
  • 1
    You missed the second sudo after adding the &&. Although it's in root crontab anyway.
    – user643011
    Commented Apr 12, 2018 at 11:41
  • 3
    There should not be any sudo in there; you've switched to the root account by using su. The superuser's crontab is run with superuser privileges.
    – goldilocks
    Commented Apr 12, 2018 at 12:34
  • 1
    @Ingo, full-upgrade is just apt's shortcut to apt-get dist-upgrade. Commented Oct 25, 2018 at 14:55
8

You can install and configure cron-apt. Install it by doing the following:

apt-get install cron-apt

the main configuration file is /etc/cron-apt/config

One thing I add to my configuration is:

MAILON="always"

this will send an email every time it runs, not only if it encounters an error.

Note that the default setup will not automatically install the updates (there are some good reasons to not do this), but you can config it to do so. One advantage this program provides over a simple cron solution is that it gives you control over what gets installed (only download new packages, install security updates or install all updates).

To set the time it runs edit the /etc/cron.d/cron-apt file.

You can find more info and config options here

The package includes very good documentation, however it is gzipped. To extract the file:

  1. create a directory to work in - mkdir cron-apt_documentation
  2. change to the new directory - cd cron-apt_documentation
  3. copy the compressed file - cp /usr/share/doc/cron-apt/README.gz . (note the trailing dot)
  4. uncompress the file - gunzip README.gz
  5. read the file - cat README | less
1
  • or zcat /usr/share/doc/cron-apt/README.gz | less
    – user67475
    Commented Apr 2, 2019 at 15:29

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.