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.
By. Jacob
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:
- /etc/cron.monthly
- /etc/cron.weekly
- /etc/cron.daily
- /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
Tell us what you think: