What is cron?

A Linux sysadmin could automate multiple tasks using bash commands. But say, what if we want to run a certain script everytime we reboot? Or, backup our system every Tuesday at 12 a.m.? This is where cron comes in handy. cron allows a sysadmin to schedule these commands/programs/tasks to run at a certain time.

cron? cronjob? crontab?

Well, the names might seem a little bit overwhelming
for beginners. Basically...

  1. cron is a program(daemon) that runs once the OS boots up.
  2. A cron job (schedule) is a command/program to be executed at a specified time.
  3. crontab (cron table) is the file that contains the cron jobs to be executed. crontab is the command for modifying cron jobs.

Creating a cronjob

Executing crontab -e (-e stands for edit) for the first time would prompt the user for a preferred text editor. We would choose nano for now since it is the most user friendly for beginners.

no crontab for d3lt4 - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  3. /usr/bin/vim.tiny
  4. /bin/ed

Choose 1-4 [1]:

cron would then create a temporary crontab along with the manual of creating cron jobs (TL;DR). Which actually comes down to this format.

cronjob

To run a cron job on every reboot, we could use @reboot at the time section. Remember that cron jobs are commands executed based on the users' table. Thus, it could only successfully execute commands that is within the priveleges of the user.

Logging cron

Logging has always been an issue for cron users due to logging settings turned off by default. But there are some tweaks to make logging feasible . cron actually keeps logs in /var/log/syslog, we could simply grep cron logs from syslog via grep.

grep CRON /var/log/syslog

Or, we could just edit syslog's settings and write all cron logs in a cron.log file by uncommenting #cron.*.

nano /etc/rsyslog.d/50-default.conf

sudo service rsyslog restart

This only logs the errors that occur within cron. If there was a syntax error within your command, you could redirect and append the output of stderr to a log file by adding a cron job. Make sure your script is executable by your user~

* * * * * /path/to/script.sh >> /path/to/log/script.log 2>&1
# redirect file descriptor 2 (stderr) to file descriptor 1 (stdout), the `&` is needed or else it would be interpreted as file name `1` instead of `stdout`