In part, I automate so I can fix stuff once -- so I don't have to smack my forehead and say, "I knew that."
I (all too) often forget that cron jobs don't have my environment, and may not even have my shell or my email address.
I solve this with a template crontab header. My crontabs start like this:
$ crontab -l ## my crontab SHELL=/bin/bash PATH=/bin:/usr/bin:~/bin BASH_ENV=/home/jsh/.bash_env MAILTOemail@example.com # minute (0-59) # | hour (0-23) # | | day of the month (1-31) # | | | month of the year (jan-dec) # | | | | day of the week (sun-mon, with 0=sun) # | | | | | command # | | | | | | # 0 23 * * * crontab -l > ~/bin/crontab.txt 2>/dev/null ...The column indicators are good reminders and visual indicators of what goes where.
Here's what the variable settings give me:
$SHELL ensures I won't use cron's default: /bin/sh
$PATH means I won't accidentally get command versions I don't want.
My .bash_env is typically a link to .bashrc. Bash sources $BASH_ENV at
startup when it's a non-interactive, non-login shell, so I get all the stuff I come to assume.
$MAILTO says where to send me error messages. I use gmail's plus addressing so I can search for my cron-job errors when I have to. I put this into root's crontabs on my boxes, too, so errors won't go to root's mailbox, which I never read.