Crontab
The crontab (cron derives from chronos, Greek for time; tab stands for table) command, found in Unix and Unix-like operating systems, is used to schedule commands to be executed periodically. To see what crontabs are currently running on your system, you can open a terminal and run:$ sudo crontab -l
$ sudo crontab -e
* * * * * /bin/execute/this/script.sh
Scheduling explained
As you can see there are 5 stars. The stars represent different date parts in the following order:- minute (from 0 to 59)
- hour (from 0 to 23)
- day of month (from 1 to 31)
- month (from 1 to 12)
- day of week (from 0 to 6) (0=Sunday)
Execute every minute
If you leave the star, or asterisk, it means every. Maybe that's a bit unclear. Let's use the the previous example again:* * * * * /bin/execute/this/script.sh
/bin/execute/this/script.sh
:- every minute
- of every hour
- of every day of the month
- of every month
- and every day in the week.
Execute every Friday 1AM
So if we want to schedule the script to run at 1AM every Friday, we would need the following cronjob:0 1 * * 5 /bin/execute/this/script.sh
- minute:
0
- of hour:
1
- of day of month:
*
(every day of month) - of month:
*
(every month) - and weekday:
5
(=Friday)
Execute on workdays 1AM
So if we want to schedule the script to Monday till Friday at 1 AM, we would need the following cronjob:0 1 * * 1-5 /bin/execute/this/script.sh
- minute:
0
- of hour:
1
- of day of month:
*
(every day of month) - of month:
*
(every month) - and weekday:
1-5
(=Monday til Friday)
Execute 10 past after every hour on the 1st of every month
Here's another one, just for practicing10 * 1 * * /bin/execute/this/script.sh
Neat scheduling tricks
What if you'd want to run something every 10 minutes? Well you could do this:0,10,20,30,40,50 * * * * /bin/execute/this/script.sh
*/10 * * * * /bin/execute/this/script.sh
Special words
For the first (minute) field, you can also put in a keyword instead of a number:@reboot Run once, at startup
@yearly Run once a year "0 0 1 1 *"
@annually (same as @yearly)
@monthly Run once a month "0 0 1 * *"
@weekly Run once a week "0 0 * * 0"
@daily Run once a day "0 0 * * *"
@midnight (same as @daily)
@hourly Run once an hour "0 * * * *"
@daily /bin/execute/this/script.sh
Storing the crontab output
By default cron saves the output of/bin/execute/this/script.sh
in the
user's mailbox (root in this case). But it's prettier if the output is saved
in a separate logfile. Here's how:*/10 * * * * /bin/execute/this/script.sh >> /var/log/script_output.log 2>&1
Explained
Linux can report on different levels. There's standard output (STDOUT) and standard errors (STDERR). STDOUT is marked 1, STDERR is marked 2. So the following statement tells Linux to store STDERR in STDOUT as well, creating one datastream for messages & errors:2>&1
>
will
overwrite the file, >>
will append to the file. In this case we'd like to
to append:>> /var/log/script_output.log
Mailing the crontab output
By default cron saves the output in the user's mailbox (root in this case) on the local system. But you can also configure crontab to forward all output to a real email address by starting your crontab with the following line:MAILTO="yourname@yourdomain.com"
Mailing the crontab output of just one cronjob
If you'd rather receive only one cronjob's output in your mail, make sure this package is installed:$ aptitude install mailx
*/10 * * * * /bin/execute/this/script.sh 2>&1 | mail -s "Cronjob ouput" yourname@yourdomain.com
Trashing the crontab output
Now that's easy:*/10 * * * * /bin/execute/this/script.sh > /dev/null 2>&1
/dev/null
is a special file that discards all
data written to it.Caveats
Many scripts are tested in a Bash environment with thePATH
variable
set. This way it's possible your scripts work in your shell, but when
run from cron (where the PATH
variable is different), the script
cannot find referenced executables, and fails.It's not the job of the script to set
PATH
, it's the responsibility of
the caller, so it can help to echo $PATH
, and put PATH=<the result>
at the top of your cron files (right below MAILTO
).
0 comments:
Post a Comment
Note: only a member of this blog may post a comment.