Beamtic's logo

Share via:

How to Setup Cron Jobs in Linux

Setting up cron jobs can be done by placing your file in the scheduling folders or by running crontab -e from a terminal.

123 views

Edited: 2020-09-04 10:59

It is possible schedule a command to run repeatedly using cron in Linux, which is useful for scheduling backups and deleting files in your personal Downloads folder.

There are a number of ways to setup a cron job, the easiest is probably to just place a .sh script in the folder that corresponds with the time you want the script to run; but finer control is provided through the crontab -e command as well.

The cron scheduling folders are self-explanatory, and can be found at:

  1. /etc/cron.monthly
  2. /etc/cron.weekly
  3. /etc/cron.daily
  4. /etc/cron.hourly

Note. dots are not allowed in file names located in these folders for technical reasons. A file name should only contain the following characters: [a-z0-9_-], otherwise it will not be executed.

Apparently this restriction is to avoid run-parts executing files left by the Debian package manager ending in .dpkg-old, .dpkg-new, .dpkg-dist, and .dpkg-orig; this behavior is inconsistent and bad, since it is generally a good practice to use proper file extensions.

To have a command run hourly, you would just need to create a .sh script file containing your command in the /etc/cron.hourly folder. For example, using nano:

sudo nano /etc/cron.hourly/my-script-sh

This will edit the /etc/cron.hourly/my-script-sh file; remember to hit CTRL + o (o as as in other) when you are done editing.

To test if the script works, you could fill the file with something like:

#!/bin/sh
echo 'hallo' > '/home/k/cron-test.txt';

This would write the string "hallo" to the /home/k/cron-test.txt file every hour.

Remember to also make the script executable:

sudo chmod +x /etc/cron.hourly/my-script-sh

Setup a cron job in Linux

To setup cron jobs, we can place our scripts within the monthly, weakly, daily, and hourly folders, but if we need finer control — as in down to the minute — over when our task should run, we can also call crontab -e from a terminal.

When crontab -e is called from a terminal, it should automatically ask you which editor you want to use to edit the crontab file; once the file is opened, it should also include an explanation.

The contents of the crontab file may look like this:

# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command

To add a .sh script that will be run every 30 minutes, we may write something like this:

*/30 * * * * /path/to/script.sh

Yay! Dots are allowed in file names when setting up cron jobs this way.

Remember, the syntax is as follows: minute hour day weak month

If an asterisk * is used instead of a numeric value, it means the command or script will be run at any minute/hour/day/weak/month — dependent on the used combination. To run a script at exactly 01:00 (24 hour format), we can write this:

0 1 * * * /path/to/script.sh

Note that this syntax defines the exact time when we want a cron job to run. If we wanted to repeatedly run the job at every minute or hour, we need to use the */[value] syntax; for example, we could write the below to have a job run every other minute:

*/2 * * * * /path/to/script.sh

Or, if we wanted to run the job every 30th minute:

*/30 * * * * /path/to/script.sh

Comments

  1. Cron scripts that are located inside the cron scheduling folders needs to adhere to these rules in order to be executed.
  2. How to search a directory and subdirectories for a given string of text in Linux with the grep command.
  3. About the problem with using sudo with graphical programs in Linux.
  4. This simple tutorial shows how to solve the problem with duplicated icons created by custom .desktop files.
  5. My experience with do-release-upgrade is that it rarely breaks anything, so I would say it is generally a safe and reliable way to upgrade Ubuntu.

More in: Linux Tutorials