Title: Using anacron to run periodic tasks
       Author: Solène
       Date: 28 June 2023
       Tags: openbsd anacron
       Description: In this article, you will learn how to use anacron to run
       periodic tasks on workstations that are not on 24/7
       
       # Introduction
       
       When you need to regularly run a program on your workstation that isn't
       powered 24/7 or even not every day, you can't rely on cronjob for that
       task.
       
       Fortunately, there is a good old tool for this job (first release June
       2000), it's called anacron and it will track when was the last time
       each configured tasks have been running.
       
       I'll use OpenBSD as an example for the setup, but it's easily adaptable
       to any other Unix-like system.
       
 (HTM) Anacron official website
       
       # Installation
       
       The first step is to install the package `anacron`, this will provide
       the program `/usr/local/sbin/anacron` we will use later.  You can also
       read OpenBSD specific setup instructions in
       `/usr/local/share/doc/pkg-readmes/anacron`.
       
       Configure root's crontab to run anacron at system boot, we will use the
       flag `-d` to not run anacron as a daemon, and `-s` to run each task in
       a sequence instead of in parallel.
       
       The crontab entry would look like this:
       
       ```
       @reboot /usr/local/sbin/anacron -ds
       ```
       
       If your computer is occasionally on for a few days, anacron won't run
       at all after the boot, so it would make sense to run it daily too just
       in case:
       
       ```
       # at each boot
       @reboot /usr/local/sbin/anacron -ds
       
       # at 01h00 if the system is up
       0 1 * * * /usr/local/sbin/anacron -ds
       ```
       
       # Anacron file format
       
       Now, you will configure the tasks you want to run, and at which
       frequency.  This is configured in the file `/etc/anacrontab` using a
       specific format, different from crontab.
       
       There is a man page named `anacrontab` for official reference.
       
       The format consists of the following ordered fields:
       
       * the frequency in days at which the task should be started
       * the delay in minutes after which the task should be started
       * a readable name (used as an internal identifier)
       * the command to run
       
       I said it before but it's really important to understand, the purpose
       of anacron is to run daily/weekly/monthly scripts on a system that
       isn't always on, where cron wouldn't be reliable.
       Usually, anacron is started at the system boot and run each task from
       its anacrontab file, this is why a delay field is useful, you may not
       want your backup to start immediately upon reboot, while the system is
       still waiting to have a working network connection.
       
       Some variables can be used like in crontab, the most important are
       `PATH` and `MAILTO`.
       
       Anacron keeps the last run date of each task in the directory
       `/var/spool/anacron/` using the identifier field as a filename, it will
       contain the last run date in the format YYYYMMDD.
       
       # Example for OpenBSD periodic maintenance
       
       I really like the example provided in the OpenBSD package.  By default,
       OpenBSD has some periodic tasks to run every day, week and month at
       night, we can use anacron to run those maintenance scripts on our
       workstations.
       
       Edit `/etc/anacrontab` with the following content:
       
       ```
       SHELL=/bin/sh
       PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
       MAILTO=""
       
       1  5 daily_maintenance    /bin/sh /etc/daily
       7  5 weekly_maintenance   /bin/sh /etc/weekly
       30 5 monthly_maintenance  /bin/sh /etc/monthly
       ```
       
       You can manually run anacron if you want to check it's working instead
       of waiting for a reboot, just type `doas anacron -ds`.
       
       What does the example mean?
       
       * every day, after 5 minutes (after anacron invokation) run `/bin/sh
       /etc/daily`
       * every 7 days, after 5 minutes, run `/bin/sh /etc/weekly`
       * every 30 days, after 5 minutes, run `/bin/sh /etc/monthly`
       
       # Useful examples
       
       Here is a list of tasks I think useful to run regularly on a
       workstation, that couldn't be handled by a cron job.
       
       * Backups: you may want to have a backup every day, or every few days
       * OpenBSD snapshot upgrade: use `sysupgrade -ns` every n days to
       download the sets, they will be installed at the next boot
       * OpenBSD packages update: use `pkg_add -u` every day
       * OpenBSD system update: use `syspatch` every day
       * Repositories update: keep your cloned git / fossil / cvs / svn
       repository up to date without doing it aggressively
       
       # Conclusion
       
       Anacron is a simple and effective way to keep your periodic tasks done
       even if you don't use your computer very often.