在我的 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.conf
syslog
答案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 守护进程。看金凤花的答案了解如何过滤掉这个特定的命令。