Crontab best practices
How to edit a crontab in a mantainable way, and other tips to use it the right way. I found a lot of messy crontabs around, it would be better to mantain order.
The software utility Cron is a time-based job scheduler in Unix-like computer operating systems
First of all, crontab environment is not the same as your shell. Only few
variables are valued, for example
A common pit fall is to schedule a script and it does not work cause it
needs environment varibles. The best trick I found is to use cron SHELL power!
Create a .cron.bash file in your home dir, containing something like the following
#!/bin/bash source .bashrc # Restore SHELL env var for cron SHELL=/bin/bash # execute the cron command in an actual shell exec /bin/bash --norc "$@"
Then on top of your crontab
# Let scheduled scripts run with the same environment as bash # shell interactive session. SHELL=.cron.bash
Make sure your scripts follow Rule of silence
but do not send standard error stream on
The best practice is to write scripts that run commands in quiet mode with
no feedback unless a verbose flag, or whatever, is passed as argument.
In this way, when a script outputs an error, crontab will send you an email
if you configure the
MAILTO variable, for example
# Send scripts output by email. MAILTOemail@example.com
Organize your schedules by frequency (hourly, daily, monthly, etc) and write then in cronological order.
Pad left single digits with a zero, to get rows alligned. Please, indent and group where it makes sense
# Bad 0 5 * * * script1.sh param1 5 5 * * * script2.sh 15 5 * * * script3.sh param1 param2 5 10 * * * script4.sh 15 10 * * * script5.sh param1 5,35 15 * * * script6.sh 15 15 * * * script7.sh # Good 00 05 * * * script1.sh param1 05 05 * * * script2.sh 15 05 * * * script3.sh param1 param2 05 10 * * * script4.sh 15 10 * * * script5.sh param1 5,35 15 * * * script6.sh 15 15 * * * script7.sh
Use comments to organize and inform, in particular when you deschedule a task temporarily with a comment, put your nick or email and a date.
Just to have an idea of what I mean:
# Countinous integration deploy. */10 * * * * continuous_deploy.sh # Every hour # ---------- 10 * * * * rotate_logs.sh 20 * * * * load_data.sh # Every day # --------- # jsmith 20160405: paused cause waiting for bla bla bla #10 04 * * * script2.sh 00 05 * * * script3.sh param1 05 05 * * * script4.sh 15 05 * * * script5.sh param1 param2 10 06 * * * script7.sh 00 19 * * 0 script8.sh 00 20 * * 0 script9.sh # Every sunday # ------------ 00 20 * * 0 rotate_table.sh campaign_dd 60 05 20 * * 0 rotate_table.sh request 90 10 20 * * 0 rotate_table.sh sales_dd 7
% is a special char you need to escape it, for example when you
date command with formatting, for example
0 5 * * * script.sh >> /my/log_`date +\%y\%m\%d`.log
See the original article: Using the
date command in your crontab.