Ubuntu 16.04下rsyslog cron.daily警告排查及抑制需求咨询
我来帮你一步步排查这个问题,Ubuntu 16.04下rsyslog被systemd频繁重启导致cron.daily警告的情况其实挺常见的,咱们先从原因分析到解决方法捋一遍:
先理清问题的核心
你提到几个关键点:没改过logrotate相关配置、rsyslog仍能正常记录日志,但syslog里能看到systemd在极短时间内多次启动rsyslog,同时cron还发了警告邮件。这大概率是logrotate执行时的服务重载/重启逻辑和systemd的守护进程管理之间出现了兼容性冲突,而非rsyslog本身的严重故障。
第一步:先拿到更详细的排查信息
要定位原因,先得看具体的错误日志和警告内容:
- 查看cron发送给你的警告邮件内容:执行
cat /var/mail/root或者直接输入mail命令查看邮件列表,找到对应的cron.daily警告,里面应该有logrotate执行时的具体报错信息。 - 查看syslog里的rsyslog重启细节:执行
grep -i "rsyslog.*start\|rsyslog.*restart\|rsyslog.*failed" /var/log/syslog,看看每次重启前有没有报错提示。 - 查看rsyslog的systemd服务日志:执行
journalctl -u rsyslog -n 30,这里会有更详细的服务启动/重启原因,比如是否是因为进程异常退出触发了systemd的重启机制。
第二步:常见原因分析与对应排查
1. logrotate的reload命令和systemd冲突
Ubuntu 16.04的默认/etc/logrotate.d/rsyslog配置里,postrotate阶段用的是传统的init脚本命令:
/etc/init.d/rsyslog reload > /dev/null 2>&1 || true
但因为系统用的是systemd,这个init脚本可能会和systemd的服务管理逻辑冲突,导致reload操作被识别为服务异常,进而触发systemd自动重启rsyslog。
你可以手动测试logrotate执行过程:
logrotate -fv /etc/logrotate.d/rsyslog
同时开另一个终端实时监控syslog:tail -f /var/log/syslog,观察执行过程中是否会触发rsyslog重启,以及有没有报错输出。
2. rsyslog在日志切换时的短暂异常
虽然rsyslog最终能正常运行,但在logrotate切换日志文件时,可能因为文件句柄处理、配置加载等问题出现短暂的非预期退出,触发了systemd的重启策略。你可以查看rsyslog的错误日志:grep -i error /var/log/syslog | grep rsyslog,看看有没有相关报错。
3. systemd的重启策略过于敏感
查看rsyslog的systemd服务配置:cat /lib/systemd/system/rsyslog.service,找到Restart=字段,默认是on-failure。如果rsyslog在reload时返回了非0的退出码(哪怕是无害的),systemd就会触发重启。
第三步:解决或抑制警告的方法
方法1:修复logrotate的reload命令(优先推荐)
把logrotate里的reload命令改成systemd原生的命令,避免兼容性问题:
- 编辑
/etc/logrotate.d/rsyslog:sudo nano /etc/logrotate.d/rsyslog - 把postrotate部分修改为:
postrotate systemctl reload rsyslog > /dev/null 2>&1 || true endscript
- 保存退出后,手动执行一次logrotate测试,看是否还会触发频繁重启。
方法2:调整systemd的rsyslog重启策略(谨慎使用)
如果确认rsyslog本身稳定,只是systemd过于敏感,可以修改服务的重启配置:
- 复制默认服务文件到/etc目录(避免系统更新覆盖):
sudo cp /lib/systemd/system/rsyslog.service /etc/systemd/system/ - 编辑
/etc/systemd/system/rsyslog.service,找到Restart=字段,改成Restart=no - 重新加载systemd配置:
sudo systemctl daemon-reload - 重启rsyslog服务:
sudo systemctl restart rsyslog
注意:这样设置后,如果rsyslog真的崩溃,systemd不会自动重启它,所以只适合确认服务稳定的场景。
方法3:抑制cron的警告邮件(最后选择)
如果确定问题无害,只是警告邮件烦人,可以让cron不发送logrotate任务的邮件:
编辑/etc/cron.daily/logrotate,在开头添加一行:
MAILTO=""
或者把logrotate命令改成:
/usr/sbin/logrotate /etc/logrotate.conf > /dev/null 2>&1
这样logrotate的输出会被丢弃,cron就不会发送警告邮件了。但要注意,这会同时屏蔽真正的错误信息,所以建议先排查并解决根源问题后再用这个方法。
内容的提问来源于stack exchange,提问作者EnterUserNameHere

