Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

On my Ubuntu-Desktop and on my debian-server I have a script which needs to be executed each minute (a script that calls the minute-tic of my space online browsergame).

The problem is that on debian derivates cron is logging to /var/log/syslog each time it executes. I end up seeing repeated the message it was executed over and over in /var/log/syslog:

Nov 11 16:50:01 eclabs /USR/SBIN/CRON[31636]: (root) CMD (/usr/bin/w3m -no-cookie http://www.spacetrace.org/secret_script.php > /dev/null 2>&1)

I know that in order to suppress the output of a program I can redirect it to /dev/null, for example to hide all error and warning messages from a program I can create a line in crontab like this

* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null

But I would like to run a cronjob and be sure that all generated output or errors are piped to NULL, so it doesn't generate any messages in syslog and doesn't generate any emails


EDIT:
there is a solution to redirect the cron-logs into a separate log like proposed here by changing /etc/syslog.conf

But the drawback is, that then ALL output of all cronjobs is redirected.

Can I somehow only redirect a single cronjob to a separate log file? Preferably configurable inside the cron.hourly file itself.

share|improve this question
1  
You can also just put MAILTO="" at the beginning of the cron file. This will suppress all emails. And I've never heard of a cron daemon which sends job output to syslog (but I guess it's possible). –  Patrick Nov 11 '13 at 5:58
    
@Patrick - that will disable everything, which might be OK, but just be aware. See my update, you can set multiple mAILTO's. –  slm Nov 11 '13 at 5:58
    
What distro are you on? Given you mentioned syslog I'm assuming it's a Debian/Ubuntu derivative. On Redhat based distros the cron output is written to /var/log/cron to cut down on the messages in /var/log/messages, the equiv. to syslog. You've already discovered the ability to partition messaging up via syslog.conf but we need you to clarify these msgs a bit further. Can you include an example in the Q? –  slm Nov 11 '13 at 13:59
    
I added the example –  rubo77 Nov 11 '13 at 15:40

4 Answers 4

Make the line this:

* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null 2>&1

This will capture both STDOUT (1) and STDERR (2) and send them to /dev/null.

MAILTO

You can also disable the email by setting and then resetting the MAILTO="" which will disable the sending of any emails.

Example

MAILTO=""
* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null 2>&1

MAILTO="admin@somedom.com"
 * * * * *      root    /usr/local/sbin/myothercommand.sh

Additional messaging

Often times you'll get the following types of messages in /var/log/syslog:

Nov 11 08:17:01 manny CRON[28381]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)

These are simply notifications via cron that a directory of cronjobs was executed. This message has nothing to do directly with these jobs, instead it's coming from the crond daemon directly. There isn't really anything you can do about these, and I would encourage you to not disable these, since they're likely the only window you have into the goings on of crond via the logs.

If they're very annoying to you, you can always direct them to an alternative log file to get them out of your /var/log/syslog file, through the /etc/syslog.conf configuration file for syslog.

share|improve this answer
    
@rubo77 - can you show an example? I'd need to see what isn't working with this. Googling turns this up as the answer: cyberciti.biz/faq/disable-the-mail-alert-by-crontab-command –  slm Nov 11 '13 at 5:56
    
This works for all output and emails, but it still generates a line for each cron-call in /var/log/syslog –  rubo77 Nov 11 '13 at 6:02
    
@rubo77 - that's what I thought you might of been asking about. You can't stop those messages, they are generated by the crond daemon itself. –  slm Nov 11 '13 at 6:04
    
@rubo77 - I'm aware of changing /etc/syslog.conf, I would hardly consider this a alternative. That will just change the file that the logs get dumped into or you can completely disable the cron messages all together. There isn't a way to do what you want. –  slm Nov 11 '13 at 6:11
    
@rubo77 - the only way you'll be able to do what you want is if you put a grep -v ... after the invoking of the crond. –  slm Nov 11 '13 at 6:13

have a script which needs to be executed each minute. The problem is that cron is logging to /var/log/syslog each time it executes. I end up seeing repeated the message it was ececuted over and over in /var/log/syslog

Since nothing you do seems to stop this, it is worth asking: what exactly is this script and what exactly is the message you see in syslog?

If slm's suggestion did not work, this is because something is logging to syslog directly -- either cron, as seems to be implied in some of your comments, or else the process run by cron. Messages sent to syslog do not come from stdin or stderr, so 2>&1&> will not help.

There might be a way to configure the behavior of the application in question, except we don't know what it is.

There certainly is a way to configure most contemporary syslog implementations (there are several) to filter messages very specifically. For example, if there is a unique tag used in the log message, you can target that. But again, since we don't know anything about the particular message, or which syslogd you use, then there's nothing specific that can be recommended.

My general point is that if you don't want to redirect/filter messages because "this will redirect all the messages", then you can refine the filtering technique. The server fault thread you linked to just mentions filtering by facility (*.cron) -- but you can configure more specialized filters than that.


Debian and Ubuntu both have rsyslog available. On debian 5+ it is the default syslog, on ubuntu it is an option, so you'll have to install it. To create a filter that targets some kind of specific content, place this near the top (i.e., before any other rules, but after the general configuration, module loading, etc) of /etc/rsyslog.conf. Best way to do this is not to edit the rsyslog.conf itself, but to create a file in /etc/rsyslog.conf.d/ directory, with name starting with two digits which are less than 50, ie /etc/rsyslog.conf.d/15-my-filter.conf. You can put there something like this:

:msg, contains, "/usr/bin/w3m -no-cookie" /dev/null

This will send the message to /dev/null (or a separate log if you prefer). However, the message will still be passed through the subsequent rules which send it to /var/log/syslog. To prevent that:

& ~

Immediately after that other line. This throws away anything which matched the preceding rule. Or, for single-line rules you can just add ~ to the end of that rule line above.

You have to restart rsyslogd after changing the configuration, either via initctl (ubuntu/upstart), service (debian/sysV), or:

kill -HUP $(cat /var/run/rsyslogd.pid)

HUP causes the daemon to restart itself.

share|improve this answer
    
I added the case I have. How can I add a filter for just that cronjob? –  rubo77 Nov 11 '13 at 15:53
    
I've added a few paragraphs. –  goldilocks Nov 11 '13 at 16:44

Redirecting to /dev/null hides the output from the command. If you don't do this then cron mails the output to you. The output from the command never ends up in system logs (at least not by cron's doing).

It is usually a bad idea to redirect output to /dev/null, especially error output: if something goes wrong, you won't have any information to diagnose the problem. If you don't want to receive a mail, redirect to a log file.

None of this is relevant to your problem however. The message you quote is from cron itself. Cron writes a log entry every time it runs a job. No cron implementation that I've seen allows you to use different logging configurations for different jobs.

If you want to omit some jobs, your only option is to apply text filtering to the log messages in the syslog daemon. The de facto standard for syslog filtering is to run rsyslog (which may or may not be the default on your system) as the syslog daemon. See goldilocks's answer for how to filter out this particular command.

share|improve this answer

Change /etc/default/cron

# Or, to log standard messages, plus jobs with exit status != 0:
# EXTRA_OPTS='-L 5'
#
# For quick reference, the currently available log levels are:
#   0   no logging (errors are logged regardless)
#   1   log start of jobs
#   2   log end of jobs
#   4   log jobs with exit status != 0
#   8   log the process identifier of child process (in all logs)
#
EXTRA_OPTS="-L 0"

By default the EXTRA_OPTS line is ""

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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