(20170327 — The steps in this post were amended to address changes in recent versions of software — iceflatline)
cron is a time-based job scheduler in BSD, Linux and other Unix-like operating systems. It is commonly used to schedule system maintenance or administrative tasks, however it can also be used by system users to schedule their own tasks.
Tasks scheduled to run from cron are typically referred to as “cron jobs.” A “crontab” (cron table) is a configuration file which contains one or more “cron job” entries (i.e., commands and/or scripts to be run at specified dates and/or times.
This post will discuss the use of cron in FreeBSD and Ubuntu server, including the location of cron-related files. The software versions used in this post were as follows:
- FreeBSD 11.0 RELEASE
- Ubuntu 16.04.2 LTS
Using cron
There are several different ways to use cron. In the /etc directory in many Linux distributions, for example, you’ll likely find some sub-directories called cron.hourly, cron.daily, cron.weekly, and cron.monthly. If you place a command into one of those directories it will be run hourly, daily, weekly or monthly, respectively. If you require more granularity, you can add cron job entires directly to the system-wide crontab file /etc/crontab. Editing this file directly however is usually discourage as it can be overwritten when the system is upgraded.
A second type of system-wide crontab can often be found in /etc/cron.d/. Within this directory are small named crontabs. The directory is often used by packages, however system users can also place a file here containing cron jobs. The file must share the same name as the user so that the system knows which user is to be associated with the commands contained within it.
Perhaps a better solution though is to create your own crontab. User crontabs allow individual users to schedule tasks without the need for root privileges. Each user can have their own crontab, and cron jobs in a users’ crontab run with the permissions of the user who creates the crontab. Although the system-wide crontab /etc/crontab is usually associated with root, the root user can also have an independent crontab just like any other user. When created, user crontab files are saved in various locations under /var. These files are not intended to be edited directly, however, but rather by using the crontab command. Here’s the crontab command’s basic syntax:
1 |
crontab [ -u user ] { -l | -r | -e } |
-u – Specifies the name of the user whose crontab is to be created or edited. If this option is not given, crontab examines “your” crontab; i.e., the crontab of the person executing the crontab command.
-l – Displays the contents of the crontab file.
-r – Removes the current crontab file.
-e – Creates a new crontab file (or edits an exiting one) using the users default command line editor specified in the environment variables. After you successfully save and exit from the editor, the modified crontab file will be installed automatically. Note that if you are running the crontab -e command inside of su you will create or edit the crontab file of the root user. Likewise if you use the command sudo crontab -e.
Each line in a crontab file contains seven fields from left to right:
1 |
Minute Hour Day Month Day-of-week User Command |
Minute – Any integer from 0 to 59.
Hour – Any integer from 0 to 23.
Day – Any integer from 1 to 31 (must be a valid day if a month is specified).
Month – Any integer from 1 to 12, or the abbreviated form of the month; e.g., jan, feb, etc.
Day of week – Any integer from 0 to 7, where 0 or 7 represents Sunday, or the abbreviated name of the week; e.g, sun, mon, etc.
User – Specifies the user under which the cron jobs are run
Command – the command to execute (the command can either be a command or the name of a script containing one or more commands)
There are also several ways of specifying multiple values in a field:
- Using a comma specifies a list of values, for example: 1,3,4,7,8. Using a hyphen specifies a range of values, for example: 1-6, which is equivalent to 1,2,3,4,5,6.
- Using an asterisk specifies all possible values for a field; e.g., every hour or every day.
- The forward slash can be used to skip a given number of values. For example, “*”/3 in the hour field is equivalent to the hours 0,3,6,9,12,15,18,21. The “*” specifies “every hour” but the “/3” means that only the first, fourth, seventh,…etc hours starting at midnight are used.
Here’s some example cron job entries using the rsync command. As you can see, you could add one or many cron job entries to your crontab depending on your needs:
1 2 3 4 5 6 7 8 |
# Run rsync every 15 minutes. */15 * * * * /usr/local/bin/rsync -avz --delete "-e ssh -p 13725" rsync@<freenas-ip-address>:/mnt/files/foo/ /home/iceflatline/backup > /dev/null 2>&1 # Run rsync at the top of every hour. 0 * * * * /usr/local/bin/rsync -avz --delete "-e ssh -p 13725" rsync@<freenas-ip-address>:/mnt/files/foo/ /home/iceflatline/backup > /dev/null 2>&1 # Run rsync at 12.59 every day. Log results to a file. 59 12 * * * /usr/local/bin/rsync -avz --delete "-e ssh -p 13725" rsync@<freenas-ip-address>:/mnt/files/foo/ /home/iceflatline/backup >> /home/iceflatline/cronlog 2>&1 |
cron will email to the user all output of the commands it runs. To silence this, the output can be redirected to a log file or to /dev/null. Note also that individual users’ crontab files (i.e., those edited via crontab -e, sudo crontab -e or under su for root’s), omit the user field since the system understands that crontab file belongs to the user. The /etc/crontab and the files in /etc/cron.d and /etc/cron.{hourly, daily, weekly, monthly}, however, do require a field for the user.
cron in FreeBSD
- cron daemon: /usr/sbin/cron
- cron start script: /etc/rc.d/cron
- crontab command: /usr/bin/crontab
- System-wide crontab files: /etc/crontab
- crontab file location created using crontab -e (The crontab file name = the user name): /var/cron/tabs/
- Log location: /var/log/cron
cron in Ubuntu server
- cron daemon: /usr/sbin/cron
- cron start script: /etc/init.d/cron
- crontab binary: /usr/bin/crontab
- System-wide crontab files: /etc/crontab and /etc/cron.d
- Other crontab locations: /etc/cron.{hourly, daily, weekly, monthly}
- crontab file location created using crontab -e (The crontab file name = the user name): /var/spool/cron/crontabs/
- Log location /var/log/syslog
Conclusion
Um… cron… ’nuff said.
References
http://ss64.com/bash/cron.html
http://www.freebsd.org/doc/handbook/configtuning-cron.html