Only email on cron errors for jobs in cron.daily, cron.hourly, etc
Solution 1
You may want to use one of the wrappers for the programs, that output everything when something goes bad and swallow stdout otherwise.
One example might be cronic, just prepend 'cronic' to 'run-parts' e.g.:
# m h dom mon dow user command
17 * * * * root cd / && /etc/cronic run-parts --report /etc/cron.hourly
where /etc/cronic
is a place with executable cronic script, downloaded from the website mentioned.
Solution 2
You should send successful email notifications to /dev/null
so they disappear.
But you want to see unsuccessful email notifications.
This means you need to first direct stdout
to /dev/null
and then direct /dev/stderr
to stdout
try changing the redirection part of your cronjobs to
>/dev/null 2>&1
See this link
Solution 3
- If the script is well behaved, it will write only to
STDOUT
if successful, and toSTDERR
in case there is an error. - By default, cron will mail everything that the script writes into
STDOUT
orSTDERR
(Arch wiki).
So, if you want to keep error notifications, don't redirect STDERR
, just STDOUT
:
COMMAND > /dev/null
If you do the typical >/dev/null 2>&1
, you are effectively suppressing both (bash documentation).
- Make
stdin
file descriptor a copy of /dev/null. - Make
stderr
file descriptor a copy ofstdout
(that already pointed to /dev/null).
Related videos on Youtube
jrdioko
Updated on September 18, 2022Comments
-
jrdioko over 1 year
I have several cron jobs that run (in
/etc/cron.daily
,/etc/cron.hourly
,/etc/cron.weekly
, etc.) and emailroot@localhost
with the results. I'd like to stop those emails if the jobs are succeeding, and only email on error (which I understand can be done by redirectingstdout
to/dev/null
). I understand how to do that for individual cron jobs, but the scripts in those special directories are run usingrun-parts
. What is the best way to suppress success emails for those scripts? -
jrdioko almost 13 yearsWouldn't that suppress the error emails too (because they wouldn't produce any output)? Also, I need to do this for my
cron.XXX
directories which userun-parts
, so it's not as simple as redirecting for individual scripts. -
Almir Sarajčić almost 13 yearsNo the idea is that
stderr
is thrown away thenstderr
is redirected tostdout
. I'm not sure whatrun-parts
is, but however it works redirection ofstdout
and thenstderr
seems to be the way. -
Almir Sarajčić almost 13 yearsAha, I googled
run-parts
. That does complicate the issue, doesn't it. Maybe you should avoidrun-parts
and invoke each script separately. -
jrdioko almost 13 yearsAh ok, I understand.
run-parts
runs all scripts in directories like/etc/cron.daily
, so the trick is passing along the redirection to the individual scripts it is running. -
Almir Sarajčić almost 13 yearsI think so. I couldn't find anything about redirecting all output from
run-parts
(not even in theman
page I just discovered I have. -
jrdioko almost 13 yearsAre you sure about the
>/dev/null 2>&1
bit? I tested it and that funnels everything to/dev/null
, where if you drop the2>&1
only stdout gets removed. -
morallo over 8 yearsEven if this does not fully answer the original question, it addresses some errors in pavium's reply.