Using Crontab
by Eric De La Cruz Lugo<[email protected]>
Ack! It's 5:00 PM! You have a date with someone very important at
5:15 PM, but you have several things to do: send email to 20 people
(telling them the same thing (Your cat had kittens!!)), transfer files
from nine FTP sites, check when and where a user is connecting to your
system, make a backup and compile that new device support into your
machine's kernel and if that wasn't enough, your provider sends you an
email telling you that the connection will end in 45 minutes and will be
back on line at 8:30 PM for a checking routine in their servers! Now what
do you do?
If you were a Windows user, then you would have to give up and wait until
the next day, because after your date you'll probably want some sleep before
connecting to the net again (after all you are only human, aren't you?).
But you are not a Windows user, you are a FreeBSD user and that single
fact makes you capable of doing things that a mere mortal (read
Windows/DOS User) can't do.
In FreeBSD (and in other UNIX-like OS's as well) a cool command exists
that lets you run instructions (like a shell script) at any given time.
The name of this command is crontab.
First we will explain what it is and how it works:
As the FreeBSD man page for crontab (crontab(5)) states, cron is "a
daemon that executes scheduled commands".
"Cron searches /var/cron/tabs for crontab files which are named after
accounts in /etc/passwd; crontabs found are loaded into memory. Cron also
searches for /etc/crontab which is in a different format. Cron then wakes
up every minute, examining all stored crontabs, checking each command to
see if it should be run in the current minute. When executing commands,
any output is mailed to the owner of the crontab (or to the user named in
the MAILTO environment variable in the crontab, if such exists)".
Here is where it all begins. The key to the solution is the crontab file.
This file has a special format, as we will see later.
A crontab file contains instructions to the cron daemon of the general
form: "run this command at this time on this date". Each user,
as we saw before, has their own crontab. Commands in any given crontab
will be executed as the user who owns that crontab file.
To allow for increased security of the system, there are some
restrictions when using the crontab command. If the /var/cron/allow file
exists, then you must be listed there in order to be allowed to use this
command. If the allow file does not exist, but the /var/cron/deny file
does, then you must not be listed in that file in order to use this
command. If neither of these files exists then, depending on the site
configuration parameters, only the super user will be allowed to use this
command, or all users will be able to use this.
In this case we assume that all users in your system are able to use the
crontab command.
The format of this file is shown below. Each line has five time and
date fields, the time and date fields are:
field allowed values
----- --------------
minute 0-59
hour 0-23
day of month 1-31
month 1-12 (or names, see below)
day of week 0-7 (0 or 7 is Sun (Sunday), or use names)
A field may be an asterisk (*), which always stands for
"first-last".
A crontab file example is given below, the # character is taken as a
comment:
# run a shell script named "daily.job" one minute after midnight,
# every day -- output mailed to eric
1 0 * * * $HOME/bin/daily.job
# run another shell script named monthly at 1:25PM on the first of
# every month -- output mailed to eric
25 13 1 * * $HOME/bin/monthly
# run at 10 PM on Monday, send email to my friends
0 22 * * 1 $HOME/bin/mail.to.friends
# Check at 9:05 AM every Monday what users are logged in the
# "itesocci.gdl.iteso.mx" machine, output mailed to eric.
5 9 * * mon finger @itesocci.gdl.iteso.mx
# Make a FTP session at 11:30 PM following the commands stored in the
# "mp3" file keep in sync every day.
30 23 * * * ftp -n -v < /home/maestros/ar/eric/bin/mp3
In the FTP session as shown above, the file "mp3" contains ftp
commands:
open 138.232.8.4
user ptagh share
lcd /home/maestros/ar/eric/mp3
hash
bin
prompt
cd unsorted
mget "*.mp3"
bye
As you can see the username and password are readable, that�s why this
"mp3" file must be readable only by the owner (use the appropriate
parameters with the chmod command (check the manual: man chmod)).
% chmod 600 mp3
The command above makes the file "mp3" readable and writeable
only for the owner.
In the email section shown above, we have a shell script named
"mail.to.friends", this shell script is shown below:
#!/bin/sh
mail -s "My cat had kittens!" [email protected],
[email protected], [email protected], [email protected] < cats
In order to run this script from our crontab file we need to make it
executable, we do this typing something like:
% chmod a+x mail.to.friends
Now that we know how the cron daemon and the crontab command work, we
can create a crontab file; in this case we'll use "eric" (in
your case, use your account name or anything else you want). Using your
favorite editor (vi, pico, joe, emacs...etc), we put the example file shown
above (of course we assume that you can make your own changes on this file
in order to do what you really want), and after that, simply type:
% crontab eric
And that's it! Now the cron daemon will check every minute for the time
it will execute the commands, and the output will be mailed to (in this
case) the user "eric".
If you want to stop a crontab just type:
% crontab -r
I hope this article helps those who want to obtain all they can from an OS
like FreeBSD and other UNIX-like systems.
After all, automation is supposed to be one of the best features of a
serious OS, isn't it?
More references.
I strongly suggest that you read the manual pages for cron and crontab.
You should also check:
Have a good time "croning"! ;-)
- Eric
About the Author
Eric De La Cruz Lugo, works for the "CONSTRUCTORA KEPLER S.A. DE C.V."
a Construction company in Mexico. Right now he is working on a project in
Merida, Yucatan, building a Power Plant. He is a loyal FreeBSD user and
admin since 1993 at ITESO University (Guadalajara, Jalisco, Mexico). He can
be reached at [email protected]
or [email protected]. |