3

I have a cron job that runs a script that writes checks for errors in an sql database and writes the errors to a log file. The log file is supplied in the command to run the script. I only want to receive an email when the script finds errors, and I want the log to be included in the email. I don't want to receive an email if the script doesn't find any errors. Apparently the script writes to the log when the script both finds or does not find errors (I didn't write this script).

    20 6-10 * * 1-5 ~/job_failure_test.sh -o ~/job_fail.log 2>&1 /dev/null | mail -s "Errors" myemail@something.com < ~/job_fail.log

So far this line sends me emails when there are errors written to the log, but it doesn't send me the updated log. It sends me the log from the previous execution of the cron job.

  • you're sending two inputs to 'mail -s` -- the (empty) output from the left side of the pipe and the redirected input from ~/job_fail.log – Jeff Schaller Oct 6 '16 at 2:21
9

Just change | (a pipe) to || (an or) (assuming the script uses exit codes properly) though changing the script to only output on error and doing this is better practice:

MAILFROM=myemail@something.com
MAILTO=myemail@something.com
20 6-10 * * 1-5 ~/job_failure_test.sh

The ugly way;

20 6-10 * * 1-5 ~/job_failure_test.sh > ~/job_fail.log 2>&1 || mail -s "Errors" myemail@something.com < ~/job_fail.log
5

This feature is built into cron! If the command produces any output, or if it returns a nonzero status, then cron sends you an email.

Many modern distributions don't set up local email. If your doesn't, install a mail transfer agent (MTA). See e.g. this thread for Ubuntu, or Minimal MTA that delivers mail locally (for cron)? if you absolutely want something minimalistic. Or just install a common MTA such as Exim or Postfix and configure it for local delivery only (see e.g. this thread) for Debian. Once local email is set up, you can read your local email with your favorite mail client.

Instead of reading your email locally, you can create a file ~/.forward containing an external email address, and all your local email will be forwarded there. If you choose forwarding, you must have an MTA that's capable of sending mail externally (“smarthost”).

Alternatively, set the MAIL variable in the crontab to make it send the email directly to that address. This too requires that your system can send email externally.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.