Disable The Mail Alert By Crontab Command On a Linux or Unix-like Systems

Posted on in Categories , , , , , , last updated May 3, 2017

How do I to disable the mail alert send by crontab? When my job is executed and the jobs cannot run normally it will sent an email to root. Why do I receive e-mails to my root account from cron? How can I prevent this? How can I disable email alert sent by cron jobs on a Linux or Unix-like systems?

The crontab command is used to maintain crontab files for individual users. By default the output of a command or a script (if any produced), will be email to your local email account. To stop receiving email output from crontab you need to append following strings at the end of crontab entry.

Cron job prevent the sending of errors and output

To prevent the sending of errors and output, add any one of the following at the end of the line for each cron job to redirect output to /dev/null.

>/dev/null 2>&1

OR

> /dev/null

OR

> /dev/null 2>&1 || true

Cron job example

Edit/Open your cron jobs, enter:
$ crontab -e
Append string >/dev/null 2>&1 to stop mail alert:

0 1 5 10 * /path/to/script.sh >/dev/null 2>&1

OR

0 1 5 10 * /path/to/script.sh > /dev/null

OR

0 * * * * /path/to/command arg1 > /dev/null 2>&1 || true

Save and close the file.

Set MAILTO variable

You can set MAILTO=”” variable at the start of your crontab file. This will also disable email alert. Edit/Open your cron jobs:
$ crontab -e
At the top of the file, enter:
MAILTO=""
Save and close the file.

This entry is 8 of 15 in the Linux Cron Jobs Howto & Tutorial series. Keep reading the rest of the series:
  1. What is cron on a Linux or Unix-like systems?
  2. HowTo: Add Jobs To cron Under Linux or UNIX?
  3. Linux Verify crond Daemon And Cronjobs Are Running
  4. Linux Start Restart and Stop The Cron or Crond Service
  5. Linux: List / Display All Cron Jobs
  6. Linux / UNIX Crontab File Location
  7. Linux / UNIX: Change Crontab Email Settings ( MAILTO )
  8. Disable The Mail Alert By Crontab Command On a Linux or Unix-like Systems
  9. Linux: At What Time Cron Entries In cron.daily, cron.weekly, cron.monthly Run?
  10. Linux Execute Cron Job After System Reboot
  11. Linux / UNIX Setup and Run PHP Script As A Cron Job
  12. How to run crontab job every minute on a Linux or Unix-like system
  13. Run crontab (cron jobs) Every 10 Minutes
  14. Cron Job Script Execution on the Last Day of a Month
  15. Run crontab (cron jobs) every 1 minute

Posted by: Vivek Gite

The author is the creator of nixCraft and a seasoned sysadmin and a trainer for the Linux operating system/Unix shell scripting. He has worked with global clients and in various industries, including IT, education, defense and space research, and the nonprofit sector. Follow him on Twitter, Facebook, Google+.

41 comment

  1. If your crontab has huge number of scripts to run it would be cumbersome to append >/dev/numm 2>&1 to each line. Like I have 369 scripts in my crontab. So I find it better to have the MAILTO=”” line at the start of my crontab instead.

  2. But if you have so many cron jobs and you want disable mail alert for a few of them, while other jobs needs a mail alert, then &>/dev/null would be the best choice.

    Thanks

  3. For the csh scripts, at least on every system I have access to, to redirect stderr, you need to put >& /dev/null after the command, not &> as indicated by the note.

  4. I used your tip for my openads installation, thanks, I think cronjobs are pretty complicated things

  5. It’ll be better if you redirect only the std output to /dev/null instead redirecting both (stdout & stderr). This way only commands with failure exit status will be delivered.


    * * * * /path/to/script.sh > /dev/null

    regards,

  6. Thank you Edward,
    your “> /dev/null” was the only option that did the job for me. I run and adminster 3 servers with OpenBSD 4.3-5 and the cron did not like any other stuff but what you wrote. Thanks a lot. You saved me a lot of work.
    Peter

  7. It is not required to restart cron to effect changes to your crontab. Each time cron wakes up, it checks to see if the crontab has changed, and if so cron reparses it.

  8. I would like to know where I can adjust the email address of cron’s mail? Apparently I set an email address somewhere when I installed the server, but I’m unable to find where I can adjust that email address. I’m running debian lenny. Can someone help me here?

    1. @Frank

      Sure, use the MAILTO=”” trick, just don’t put “”

      MAILTO=”[email protected]

  9. Hi Vivek, great tip, thank you!

    The correct way to restart crond in HP-UX is:

    # /sbin/init.d/cron stop
    # /sbin/init.d/cron start

    Best regards.

  10. Hi,
    I wrote to the top of my crontab file
    MAILTO=”[email protected]

    and the outputs of commands are not coming to my gmail adress. Why?

    Thank you.

  11. @IIker, Have a look at your

    /etc/postfix/sender_canonical
    /etc/aliases

    and reload with

    /etc/postfix/postmap sender_canonical

    /etc/postalias aliases

    with aliases you can send mails to root and other addresses without putting it in the MAILTO in crontab. That’s how I was told to do it and it works on my servers.

  12. Will this work for the at command as well?
    I’m trying to setup a series of commands that check for a condition and then reschedule themselves until it’s not true. The problem is every run sends an email to root, I need to stop that.

  13. Hi Vivek Gite,

    Thank you for your post.

    You can use several times the MAILTO variable in order to enable/disable e-mail sending to specific CRON job.

    # Disable e-mail sending
    MAILTO=""
    * * * * * /bin/echo "Test email with MAILTO=\"\""
    
    # Send e-mail to [email protected]
    MAILTO="[email protected]"
    * * * * * /bin/echo "Test email with MAILTO=\"[email protected]\""
    
    # Send e-mail to [email protected]
    MAILTO="[email protected]"
    * * * * * /bin/echo "Test email with MAILTO=\"[email protected]\""
    
    However, multi e-mail in MAILTO generate for me the "(CRON) error (bad mailto)" (in /var/log/syslog)
    (Linux u-server-3-guest-2 2.6.38-10-virtual #46-Ubuntu SMP Tue Jun 28 17:54:41 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux
    )
    
    # The following does not work, but should, if somebody know why
    MAILTO="[email protected], [email protected]"
    * * * * * /bin/echo "Test email with MAILTO=\"[email protected], [email protected]\""
    

    Cheers,
    Mickael

  14. Hi,

    I have another question for you. I want to set a cronjob which should be doing following:
    checking a error file if generated every night in a specific directory and if there is one then sending to 5 users email id?

    I think this should be done by creating a shell script and scheduling it every night.

    Thanks a lot

    1. Hi Rick,

      I must say, it is not really a question about CRON, you are asking for writing a bash script?
      Could you give your current scipt and if you have an issue with CRON notification, you could details your problem.

      Cheers,
      Mickael

  15. @Michael

    Thanks for replying here it is

    #!/bin/sh
    err_log_dir=”/apps/Load/DataLoad/DataLoadLogs”
    logfile=”/apps/Load//DataLoad/DataLoadLogs/Mail_Log.log”

    count=$(ls -1 ${err_log_dir}/*.err 2>/dev/null | wc -l)
    if [ $count != 0 ]
    then
    echo “ERROR: There was an error in loading data” >> ${logfile}
    MAILTO=”xysz.com” >> ${logfile}
    else
    echo “No Error file was created.” >> ${logfile}
    exit
    fi

  16. This solution suits me ^^
    I use MailTo = “myemail” at the beginning of the crontab-e line to receive all email on my mailbox
    For cron which I do not wish to receive mails I add> / dev / null 2> & 1 at the end of the cron

    Thank you.

  17. I tried this, but I receive an error:

    MAILTO=””
    crontab: error on previous line; unexpected character found in line.

  18. hi,

    Can u please tell me if i use MAILTO=”” option to stop receiving mails from cron then
    where this mails will be stored.?
    Will it go in trash or in queue ?

    1. To the best of my knowledge, cron will not even generate mail because it has no user or address to send the mail to, so it merely executed the jobs in place and the output vanishes into the great /dev/null in the sky.

  19. It is also worth noting that you can mix this up as well. For instance, if you have ten cron jobs and you want email for eight of them, you can do as follows:

    ####
    cron job 1
    cron job 2
    …
    cron job 8

    MAILTO=””
    cron job 9
    cron job 10

    Cron, at least as of OS X El Capitan, which runs the latest BSD release, will use the default method of mailing the crontab owner for the first 8 jobs, then ditch any mail for the last two. You can mix it up further and specify different email addresses or user accounts for each cron job in your tab. Just note that when you use MAILTO=”foo”, cron will use that user or email address for every cron job that follows in the tab unless you redeclare MAILTO.

  20. On some crond’s, one can handle this issue at a high level (and circumvent bad crontab files), by adding to /etc/sysconfig/crond: CRONDARGS=”-moff”, and then restart the crond daemon. This tells crond not to send mail at all.

  21. Remove the period on your first unix command. E.g. instead of

    >/dev/null 2>&1.

    make it just

    >/dev/null 2>&1

Comments are closed.