summaryrefslogtreecommitdiff
path: root/content/cron.md
diff options
context:
space:
mode:
Diffstat (limited to 'content/cron.md')
-rw-r--r--content/cron.md173
1 files changed, 173 insertions, 0 deletions
diff --git a/content/cron.md b/content/cron.md
new file mode 100644
index 0000000..f06a2a4
--- /dev/null
+++ b/content/cron.md
@@ -0,0 +1,173 @@
+---
+title: "Cronjobs"
+date: 2020-07-01
+tags: ["server"]
+---
+
+Cron is a service that lets you run scheduled tasks on a computer. These tasks
+are called **cronjobs.** If you have already followed the initial course you
+will have already used cron when you set up Certbot, but we'll explain how they work generally here.
+
+## What tasks would I want to schedule?
+
+You can schedule anything! Some examples of what you might have done
+already include:
+
+- `updatedb` to update your `locate` database to let you quickly search for files
+- `certbot` to update renewing of your https certs
+
+Some tasks that you might _want_ to schedule may include:
+
+- Package updates - if you really just want to leave your server alone
+ you can automate updating packages on your server
+- Backups - you may want to backup certain files every day and some
+ every week, this is possible with cron
+
+And many more, anything you can do can be turned into a cronjob.
+
+## Basic Cronjobs
+
+This the preferred method for personal tasks and scripts; it\'s also the
+easiest to get started with. Run the command `crontab -e` to access your
+user\'s crontab
+
+Once you have figured out the command you want to run you need to figure
+out how often you want to run it and when. I am going to schedule my
+system updates once a week at 3:30 AM on Mondays.
+
+We now have to convert this time (Every Monday at 3:30 AM) into a cron
+time. Cron uses a simple but effective way of scheduling when to run
+things.
+
+Crontab expressions look like this `* * * * * command-to-run` The five
+elements before the command tell when the command is supposed to be run
+automatically.
+
+So for our Monday at 3:30 AM job we would do the following:
+
+```txt
+ .---------------- minute (0 - 59)
+ | .------------- hour (0 - 23)
+ | | .---------- day of month (1 - 31)
+ | | | .------- month (1 - 12)
+ | | | | .---- day of week (0 - 6)
+ | | | | |
+ * * * * *
+30 3 * * 1 apt -y update && apt -y upgrade
+```
+
+### Some notes
+
+- On the day of the week option, Sunday is 0 and counting up from
+ there, Saturday will be 6.
+- `*` designates \"everything\". Our command above has a `*` in the
+ day of month and month columns. This means it will run regardless of
+ the day of the month or month.
+- The hour option uses 24 hour time. 3 = 3AM, while we'd use 15 for 3PM.
+
+### More examples
+
+Let\'s add another job, our backup job (for the purpose of this our
+backup command is just called `backup`). We want to run `backup` every
+evening at 11PM. Once we work out the timings for this we can add this new job
+to the same file as the above by running `crontab -e` This would mean our
+full crontab would look like this:
+
+```txt
+0 23 * * * backup
+```
+
+### Consecutive times
+
+Suppose we want a command to run every weekday. We know we can put `1`
+(Monday), but we can also use `1-5` to signify from day 1 (Monday) to
+day 5 (Friday).
+
+```txt
+0 6 * * 1-5 echo "Wakey, wakey, wagie!" >> /home/wagie/alarm
+```
+
+The above `echo` command runs every Monday through Friday at 6:00AM.
+
+### Non-consecutive times
+
+We can also randomly specify non-consecutive arguments with a comma.
+Suppose you have a script you want to run at the midday of the 1st,
+15th, and 20th day of every month. You can specify that by putting
+`1,15,20` for the day of the month argument:
+
+```txt
+0 12 1,15,20 * * /usr/bin/pay_bills_script
+```
+
+### \"Every X minutes/days/months\"
+
+We can also easily run a command every several minutes or months,
+without specifying the specific times:
+
+```txt
+*/15 * * * * updatedb
+```
+
+This cronjob will run the `updatedb` command every 15 minutes.
+
+### Beware of this Rookie Mistake Though\...
+
+Suppose you want to run a script once every other month. You might be
+_tempted_ write this:
+
+```txt
+* * * */2 *
+```
+
+That might _feel right_, but this script _will be running once every
+minute during that every other month_. You should specify the first two
+arguments, because with `*` it will be running every minute and hour!
+
+```txt
+0 0 1 */2 *
+```
+
+This makes the command run _only_ at 0:00 (12:00AM) on the first day of
+every two months, which is what we really want.
+
+Consult the website [crontab.guru](https://crontab.guru) for an
+intuitive and interactive tester of cronjobs.
+
+## User vs. Root Cronjobs
+
+It is important to note that user accounts all have different cronjobs.
+If you have a user account `chad` and edit his crontab with
+`crontab -e`, the commands you add will be run as the `chad` user, not
+`root` or anyone else.
+
+Bear in mind that if you need root access to run a particular command,
+you will usually want to add it as root.
+
+## System-wide cron directories
+
+`crontab -e` is the typical interface for adding cronjobs, but it\'s
+important to at least know that system-wide jobs are often stored in the
+file directory. Some programs which need cronjobs will automatically
+install them in the following way.
+
+Run the command `ls /etc/cron*` and you should see a list of directories and
+their contents. The list of directories should look something like the below:
+
+- /etc/cron.d _This is a crontab like the ones that you create with_
+ `crontab -e`
+- /etc/cron.hourly
+- /etc/cron.daily
+- /etc/cron.weekly
+- /etc/cron.monthly
+
+The directories cron.{hourly,daily,weekly,monthly} are where you can put
+**scripts** to run at those times. You don\'t put normal cron entries
+here. I prefer to use these directories for system wide jobs that don\'t
+relate to an individual user.
+
+## Contribution
+
+- Mark McNally \-- [website](https://mark.mcnally.je),
+ [Youtube](https://www.youtube.com/channel/UCMiInY8BhSUtCarO6uu6i_g)
+- Edits and examples by Luke