I have several cron jobs that run (in /etc/cron.daily
, /etc/cron.hourly
, /etc/cron.weekly
, etc.) and email root@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 redirecting stdout
to /dev/null
). I understand how to do that for individual cron jobs, but the scripts in those special directories are run using run-parts
. What is the best way to suppress success emails for those scripts?
3 Answers
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.
-
this works great..
apt install cronic
and then putchronic
in front of any command in crontab.. fyi, crontab -e file is located at/var/spool/cron/crontabs/root
vs/etc/crontab/
.. addMAILTO=my@email.com
to it at the top.. it has 600 perms.– alchemyJan 13 at 1:10
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
-
Wouldn'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.– jrdiokoMay 29, 2011 at 1:47 -
No 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.– paviumMay 29, 2011 at 2:01 -
Aha, I googled
run-parts
. That does complicate the issue, doesn't it. Maybe you should avoidrun-parts
and invoke each script separately.– paviumMay 29, 2011 at 2:05 -
Ah 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.– jrdiokoMay 29, 2011 at 2:06 -
2Are 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.– jrdiokoMay 29, 2011 at 4:42
- 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).
-
Even if this does not fully answer the original question, it addresses some errors in pavium's reply.– moralloSep 2, 2015 at 9:15