我有一个需要每分钟执行一次的脚本。问题是/var/log/syslog
每次执行时,cron 都会记录日志。我最终看到类似这样的内容在 中反复出现/var/log/syslog
:
Jun 25 00:56:01 myhostname /USR/SBIN/CRON[1144]: (root) CMD (php /path/to/script.php > /dev/null)
我正在使用 Debian。
我的问题是:有什么方法可以告诉 cron 不要每次都将这些信息写入 syslog?
答案1
您可以将 cron 的输出发送到单独的日志设备,并将以下内容添加到您的/etc/syslog.conf
文件中:
# Log cron stuff
cron.* /var/log/cron
记得添加/var/log/cron
到您的/etc/logrotate.d/syslog
以确保它被旋转,例如
# /etc/logrotate.d/syslog
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron {
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
答案2
好的,
我的问题的答案是:
改变
*.*;auth,authpriv.none -/var/log/syslog
到
*.*;cron,auth,authpriv.none -/var/log/syslog
然后/etc/syslog.conf
重新启动 syslog
我还按照 Dave Cheney 的建议发送了 cron/var/log/cron.log
并在其上设置了 logrotate。我使用 Daves 建议的修复方法最适合我的情况,因为:
- 它避免
/var/log/syslog
了 cron 消息的混乱 - 我仍然会收到 cron 消息(这对于故障排除很有用)
- logrotate 不会
/var/log/cron.log
变得太大。
答案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
实际上,“最佳”解决方案(人们可以声称)是@DaveCheney 的组合建议以及 user7321最终,另外我建议采取第三项行动:
- 防止 syslogd 将与 cron 相关的日志消息附加到 /var/log/syslog
- 确保 cron 日志消息确实记录在某处(具体来说,在 /var/log/cron 中)+ 确保 cron 日志的日志轮换。
- 防止 syslogd 将与 cron 相关的日志消息附加到 /var/log/messages
在您的 中/etc/syslog.conf
,这些建议的组合发生了如下变化:
*.*;cron,auth,authpriv.none -/var/log/syslog
auth,authpriv.none;daemon.none;mail,news.none -/var/log/messages
进入:
cron.* /var/log/cron.log
*.*;cron,auth,authpriv.none -/var/log/syslog
auth,authpriv.none;cron,daemon.none;mail,news.none -/var/log/messages
并且不要忘记强制重新加载(或重新启动) cron 和 syslogd 服务,例如使用:
/etc/init.d/syslogd force-reload
/etc/init.d/cron force-reload
注意:这也适用于 rsyslogd。