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:
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