And yet another issue with cron.

I want to get an e-mail when something goes wrong on our servers. Especially if it’s a scheduled script that I normally don’t check that often any-more. (as you know from my previous post, some of scripts run every 10s, so even if I would check it by hand every hour, a serious backlog could already be generated). This worked very well by just creating a ‘forward’ file in the home directory of the user. ( ~/forward) which contains one e-mail address. The problem is that only the ‘from’ address will be something like hostname@domain [without any tld or something]. And our exchange server didn’t want to except e-mails coming from such a source.

After some googling and trying things I decided to give up and write my own very small script that takes care of this all.

#!/bin/bash
stuff=""
#put all output in one string
while read data; do
    stuff="$stuff n $data"
done
#if string is not empty, send e-mail with contents
if [[ -n "$stuff" ]]
then
  datetime=$(date "+%Y-%m-%d %H:%M:%S.%N")
  echo -e "Date: $datetime \n Trace: $stuff" | mail -s 'MESSAGE FROM CRON'  -- -f
fi

This is how the mailer is called inside the crontab system:

*/10 * * * * /path/to/script 2>&1 &>/dev/null | /path/to/cronmailer

ps: if someone knows a better solution, like, how to set a ‘from’ address in cron, please tell me.. but for now this will work just fine..

[edit]
For some reason, another options just started to work. Not sure what I did wrong the first time I tried it :)
Anyway, you can also set the ‘MAILFROM’ value when editing the crontab.
Just add the following to the top of your crontab:

MAILFROM=your@email.tld

Thanks Patrick for letting it me try again. But this option is only available on newer machines. (I can’t find it on rhel 5/6)