我如何完全使对/ dev / null /的cronjob静音?


72

在我的Ubuntu-Desktop和debian服务器上,我有一个需要每分钟执行一次的脚本(该脚本调用我的在线在线Browsergame的分钟记录)。

问题在于,在debian派生产品上,cron /var/log/syslog每次执行时都会记录日志。我最终看到一遍又一遍地重复执行它的消息/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)

我知道,为了抑制程序的输出,我可以将其重定向到/dev/null,例如,隐藏程序中的所有错误和警告消息,可以在crontab中创建这样的一行

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

但是我想运行一个cronjob并确保所有生成的输出或错误都通过管道传递给NULL,因此它不会在syslog中生成任何消息,也不会生成任何电子邮件


编辑:
有一种解决方案可以通过更改更改将cron日志重定向到此处建议的单独日志中/etc/syslog.conf

但是缺点是,然后所有cronjobs的ALL输出都将被重定向。

我可以以某种方式仅将单个cronjob重定向到单独的日志文件吗?最好是在cron.hourly文件本身内部可配置。


2
您也可以将其放在MAILTO=""cron文件的开头。这将禁止所有电子邮件。而且我从未听说过将作业输出发送到syslog的cron守护程序(但我想可能)。
帕特里克·

@Patrick-这将禁用所有功能,这可能没问题,但请注意。查看我的更新,您可以设置多个mAILTO。
slm

是的,MAILTO=""因为crontab的第一行将阻止发送任何电子邮件。另外,如果要禁止所有输出,请在命令行上使用完整的trifecta。通过该字符串重定向所有3种: >/dev/null 2>&1 -当然,您可以让脚本将定期写入单独的日志中。
SDsolar

Answers:


119

将此行设置为:

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

这将同时捕获STDOUT(1)和STDERR(2)并将它们发送到/dev/null

马利托

您还可以通过设置然后重新设置来禁用电子邮件,MAILTO=""该操作将禁用所有电子邮件的发送。

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

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

其他讯息

通常,您会在以下类型中收到以下类型的消息/var/log/syslog

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

这些只是通过cron通知已执行cronjobs目录。该消息与这些作业没有直接关系,而是crond直接从守护程序发出。您实际上对这些没有什么能做的,我鼓励您不要禁用这些,因为它们很可能是您crond通过日志了解到的唯一窗口。

如果它们很烦您,您可以始终/var/log/syslog通过将其/etc/syslog.conf配置文件定向到其他日志文件,以将其从文件中删除syslog


@ rubo77-您可以举个例子吗?我需要看看有什么不适。谷歌搜索将其作为答案:cyberciti.biz/faq/disable-the-mail-alert-by-crontab-command
slm

这适用于所有输出和电子邮件,但它仍然生成在/ var每个cron的呼叫线路/ log / syslog的
rubo77

@ rubo77-这就是我想你可能一直在问的问题。您无法停止这些消息,它们是由crond守护程序本身生成的。
slm

@ rubo77-我知道要更改/etc/syslog.conf,因此我几乎不会认为这是替代方法。这只会更改日志转储到的文件,或者您可以完全完全禁用cron消息。没有一种方法可以做您想要的。
slm

1
@ rubo77-唯一可以执行您想要的操作的方法是grep -v ...,在调用之后放一个crond
slm

10

有一个脚本,需要每分钟执行一次。问题在于cron每次执行时都会登录到/ var / log / syslog。我最终看到一遍又一遍地在/ var / log / syslog中重复执行了该消息

既然你什么都不做似乎停止这一点,值得一问:什么恰好是这个剧本,什么究竟是你在系统日志看到消息?

如果slm的建议不起作用,这是因为某些内容直接记录到syslog中-您似乎在某些注释中暗示了cron,或者cron 运行了该过程。 发送到syslog的消息不是来自stdin或stderr,因此2>&1&>无济于事。

可能有一种方法可以配置有问题的应用程序的行为,除非我们不知道它是什么。

当然,有一种方法可以配置大多数现代syslog实现(有几种)来非常具体地过滤消息。例如,如果日志消息中使用了唯一标记,则可以将其作为目标。但是同样,由于我们对特定消息或所使用的syslogd一无所知,因此没有什么可推荐的。

我的一般观点是,如果您不想因为“这将重定向所有消息”而重定向/过滤消息,则可以改进过滤技术。 您链接到的服务器故障线程仅提及按设施(*.cron)进行过滤-但您可以配置更多专门的过滤器


Debian和Ubuntu都有可用的rsyslog。在debian 5+上,它是默认的系统日志,在ubuntu上,它是一个选项,因此您必须安装它。要创建针对某种特定内容的过滤器,请将其放置在的顶部附近(即,在任何其他规则之前,但在常规配置,模块加载等之后)/etc/rsyslog.conf。最好的方法不是编辑rsyslog.conf自身,而是在/etc/rsyslog.conf.d/目录中创建一个文件名,名称以小于50的两位数字开头,即/etc/rsyslog.conf.d/15-my-filter.conf。您可以在此处放置以下内容:

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

这会将消息发送到/dev/null(如果您愿意,也可以发送单独的日志)。但是,该消息仍将通过将其发送到的后续规则传递/var/log/syslog。为防止这种情况:

& stop

在另一行之后。这将丢弃任何与前面的规则匹配的东西。或者,对于单行规则,您可以仅将其添加stop到该规则行的末尾。

您必须rsyslogd在更改配置后重新启动(例如,在systemd系统上systemctl restart rsyslog):

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

HUP使守护程序重新启动。


对于rsyslog ~,现在已弃用,应将其替换为stoprsyslogd.conf文件中的位置也很重要。因此,对于rsyslog,我只会使用:msg, contains, "/usr/bin/w3m -no-cookie" stop。然后重新启动sudo systemctl restart rsyslog
Frank Breitling

4

更改 /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"

默认情况下,该EXTRA_OPTS行是""


2

重定向到/dev/null隐藏命令的输出。如果您不这样做,那么cron会将输出邮寄给您。命令的输出永远不会出现在系统日志中(至少不是cron所做的)。

将输出重定向到/dev/null,尤其是错误输出通常是一个坏主意:如果出现问题,您将没有任何信息可以诊断问题。如果您不想接收邮件,请重定向到日志文件。

但是,这些都与您的问题无关。您引用的消息来自cron本身。Cron每次运行作业时都会写一个日志条目。我见过的任何cron实现都不允许您对不同的作业使用不同的日志记录配置。

如果要省略一些作业,则唯一的选择是将文本过滤应用于syslog守护程序中的日志消息。syslog过滤的事实上的标准是将rsyslog(可能是系统默认值,也可能不是系统默认值)作为syslog守护程序运行。有关如何过滤此特定命令的信息,请参见goldilocks的答案

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.