我如何将 cronjob 完全静音到 /dev/null/?

我如何将 cronjob 完全静音到 /dev/null/?

在我的 Ubuntu 桌面和 debian 服务器上,我有一个需要每分钟执行一次的脚本(一个调用我的分钟的脚本)太空在线浏览游戏)。

问题是,在 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,因此它不会在系统日志中生成任何消息,也不会生成任何电子邮件


编辑:
有一个解决方案可以将 cron-logs 重定向到单独的日志中就像这里建议的那样通过改变/etc/syslog.conf

但缺点是,所有 cronjobs 的所有输出都会被重定向。

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

答案1

使该行如下:

* * * * *       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="[email protected]"
 * * * * *      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.confsyslog

答案2

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

由于您似乎没有采取任何措施来阻止这种情况,因此值得一问:什么确切地这个脚本是什么?确切地是您在系统日志中看到的消息吗?

如果 slm 的建议不起作用,这是因为有东西直接记录到 syslog - 要么是 cron,正如您的一些评论中似乎暗示的那样,要么是其他由 cron 运行的进程。 发送到 syslog 的消息不是来自 stdin 或 stderr,因此2>&1&>没有帮助。

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

当然有一种方法可以配置大多数现代系统日志实现(有多种)来非常具体地过滤消息。例如,如果日志消息中使用了唯一标签,您可以将其作为目标。但同样,由于我们不知道有关特定消息或您使用哪个 syslogd 的任何信息,因此没有任何可以推荐的具体内容。

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


Debian 和 Ubuntu 都有系统日志可用的。在 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 导致守护进程自行重新启动。

答案3

改变/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行是""

答案4

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

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

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

如果您想省略某些作业,唯一的选择是对 syslog 守护程序中的日志消息应用文本过滤。系统日志过滤的事实标准是运行系统日志(这可能是也可能不是您系统上的默认设置)作为 syslog 守护进程。看金凤花的答案了解如何过滤掉这个特定的命令。

相关内容