Previous Page
Next Page

6.4. Scheduling Tasks

Fedora Core can schedule tasks to be run at specific times. This is useful for making backups, indexing data, clearing out temporary files, and automating downloads and it's easy to set up.

6.4.1. How Do I Do That?

To schedule a task, use crontab with the -e option to edit your list of scheduled tasks:

$ crontab -e
            

The vi editor will start up, and any existing scheduled tasks will appear (if you don't have any scheduled tasks, the document will be blank). Edit the file using standard vi editing commands.

Each scheduled task occupies a separate line in this file. Each line consists of five time fields, followed by the command to be executed. In order, the file fields are:


minute

The number of minutes past the hour, 059


hour

The hour of the day, 023


day

The day of the month, 131


month

The number of the month, 112


day of the week

The day of the week, 06 (Sunday to Saturday) or 17 (Monday to Sunday), or written out

A time field may contain an asterisk, which means any.

Here is an example:

30 * * * *    /home/chris/bin/task1

The script or program /home/chris/bin/task1 will be executed at 30 minutes past the hour, every hour of every day of every month. Here are some other examples:

15 1 * * *    /home/chris/bin/task2
0 22 * * 1    /home/chris/bin/task3
30 0 1 * *    /home/chris/bin/task4
0 11 11 11 *  /home/chris/bin/task5

task2 will be executed at 1:15 a.m. every day. task3 will be executed at 10:00 p.m. every Monday. task4 will be run at 12:30 a.m. on the first of every month. task5 will be run at 11:00 a.m. each Remembrance Day (Veteran's Day).

You can use a range (low - high), a list of values (1,2,3), or */ increment to specify every increment unit. Here are some more examples to illustrate:

0,15,30,45 9-16 * * *    /home/chris/bin/task6
*/2 * * * *    /home/chris/bin/task7
0 7 1-7 * 3    /home/chris/bin/task8

task6 will be run every 15 minutes (at 0, 15, 30, and 45 minutes past the hour) from 9:00 a.m. to 4:45 p.m. every day. task7 will be executed every two minutes. task8 will be executed at 7:00 a.m. on the first Wednesday of each month (the only Wednesday between the first and seventh of the month).

By default, any output (to stdout or stderr) produced by a scheduled command will be emailed to you. You can change the email destination by including a line that sets the MAILTO environment variable:

MAILTO=cronman@gmail.com
30 * * * *    /home/chris/bin/task1
15 1 * * *    /home/chris/bin/task2
0 22 * * 1    /home/chris/bin/task3

In fact, you can also set any standard environment variables; the two most useful are SHELL, which overrides the default shell (bash), and PATH, which overrides the default path (/bin:/usr/bin). Here's an example:

PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin
SHELL=/bin/zsh
MAILTO=""
30 * * * *    adjust-network

Fedora also provides a system for running scripts on an hourly, daily, weekly, and monthly basis, simply by placing the script into a designated directory. These scripts run as root. Table 6-8 shows the time of execution for each directory.

Table 6-8. Scheduled task directories
DirectoryFrequencyTime of executionTask examples
/etc/cron.hourly

Hourly:01 past each hourSend/receive netnews
/etc/cron.daily

Daily4:02 a.m. every dayAnalyze web logs, rotate logs, delete old temporary files, monitor cryptographic certificate expiry, update installed software
/etc/cron.weekly

Weekly4:22 a.m. every SundayClean up old yum packages, index manpages
/etc/cron.monthly

Monthly4:42 a.m. on the first day of every month(None defined)


Many Fedora packages install files into these directories to schedule tasks; for example, the webalizer package installs /etc/cron.daily/00webalizer to set up automatic web log analysis.

If a task is not performed because the system is off at the scheduled time, the task is performed at the next boot or the next regularly scheduled time, whichever comes first (except for hourly tasks, which just run at the next scheduled time). Therefore, the regularly scheduled maintenance tasks will be still be executed even on a system that is turned on only from (say) 8:00 a.m. to 5:00 p.m. on weekdays.

6.4.2. How Does It Work?

The cron server daemon executes tasks at preset times. The crontab files created with the crontab command are stored in a text file in /var/spool/cron.

There is also a system-wide crontab file in /etc/crontab and additional crontab files, installed by various software packages, in /etc/cron.d. These crontab files are different from the ones in /var/spool/cron because they contain one additional field between the time values and the command: the name of the user account that will be used to execute the command.

This is the default /etc/crontab file installed with Fedora Core:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

The entries in this file execute the scripts in the directories listed in Table 6-8. Note that the sixth field is root, meaning that these scripts are executed with root permission.

The files in /etc/cron.d may also be executed by the anacron service during system startup (anacron takes care of running jobs that were skipped because your computer was not running at the scheduled time). The files /var/spool/anacron/cron.daily, /var/spool/anacron/cron.monthly, and /var/spool/anacron/cron.weekly contain timestamps in the form YYYYMMDD recording when each level of task was last run.

The default /etc/anacrontab looks like this:

# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

1       65      cron.daily              run-parts /etc/cron.daily
7       70      cron.weekly             run-parts /etc/cron.weekly
30      75      cron.monthly            run-parts /etc/cron.monthly

The three entries at the end of this file have four fields, specifying the minimum number of days that must have elapsed since a command was last run before it is run again, the number of minutes after anacron is started that the command should be executed, the anacron label (corresponding to the timestamp filename in /var/spool/anacron), and the command to be executed. If the specified number of days has elapsedfor example, the weekly tasks have not been executed in more than a weekthe anacron service starts the appropriate tasks after the specified delay (so, in this example, weekly tasks would be executed approximately 70 minutes after system boot).

6.4.3. What About...

6.4.3.1. ...daylight savings time?

In many parts of the world, daylight savings time, or summer time, shifts the local time by one hour through the spring and summer months. In most jurisdictions in North America, the local time jumps from 2:00 a.m. to 3:00 a.m. during the spring time change and from 3:00 a.m. to 2:00 a.m. during the autumn time change. The spring time change has been held on the first Sunday in April, but that will change (experimentally) to the second Sunday in March in 2007. The fall time change has been held on the last Sunday in October, which will change to the first Sunday in November in 2007. If the changes do not result in significant energy savings, governments may revert to the traditional dates.

This means that there is no 2:30 a.m. local time on the day of the spring time change, and that 1:30 a.m. local time happens twice on the day of the fall time change.

crond was written to take this issue into account. Jobs scheduled to run between 2:00 and 3:00 a.m. during the spring time change will execute as soon as the time change occurs, and jobs scheduled to run between 1:00 and 2:00 a.m. during the autumn time change will be executed only once.

6.4.3.2. ...using an editor other than vi to edit the crontab?

The environment variable EDITOR can be used to specify a different editor, such as emacs, joe, or mcedit. You can set this variable temporarily by assigning a value on the same command line as the crontab command:

$ EDITOR=joe crontab -e
               

It may be useful to edit your ~/.bash_profile and add this line to permanently specify a different editor:

export EDITOR=mcedit
               

6.4.3.3. ...loading the crontab from a file?

When executed without any arguments, the crontab command will read the crontab configuration from the standard input. You can use this feature to load the configuration from a file:

$ crontab </tmp/newcrontab

To see the current crontab configuration, use the -l option:

$ crontab -l
# Backup ~chris/oreilly/ to bluesky:~chris/backup/ as a tar archive
30 0,12 * * * /usr/local/bin/bluesky-backup-oreilly

# Update the local rawhide repository
0 5 * * * /usr/local/bin/rawhide-rsync

Putting these features together, you can create a simple script to edit a crontab configuration:

#!/bin/bash
# addtmpclean :: add a crontab entry to clean ~/tmp daily

(crontab -l ; echo "30 4 * * * rm -f ~/tmp/*")|crontab

6.4.4. Where Can I Learn More?

  • The manpages for cron, crontab(1), crontab(5), anacron, and anacrontab


Previous Page
Next Page