Ubuntu 20.04 中如何把 cron 任务的输出写入 syslog?
Ubuntu 上 cron 任务输出通常交给本地邮件;把脚本输出管道给 logger 可进入 syslog。rsyslog 的 cron 路由记录守护进程事件,不会自动收集任务输出。
两种方式:一、在 crontab 里把输出管道给 logger 命令(最灵活,可自定义标签);二、确保 rsyslog 开启了 cron 日志配置,让 cron 守护进程的记录写入 /var/log/syslog。
方式一:logger 命令(推荐,控制力强)
* * * * * /home/user/myjob.sh 2>&1 | logger -t myjob
2>&1把标准错误合并到标准输出;logger -t myjob把内容写入 syslog,标签为myjob;- 日志落点取决于 syslog/journald 路由;-t 设置标签,不改变 facility,需要时显式指定 -p。
上述管道的默认退出码来自 logger,不代表脚本成功。若要保留任务状态,可在 Bash 包装脚本中执行管道后立即保存 statuses=("${PIPESTATUS[@]}"),检查任务与 logger 各自状态,再以任务失败状态退出;普通 /bin/sh 不支持 PIPESTATUS。
方式二:rsyslog 记录 cron 日志
部分 Ubuntu 配置注释的是独立 cron.log 路由,不代表 cron 记录没有进入 syslog。检查并按需要编辑 /etc/rsyslog.d/50-default.conf:
# 找到这行,去掉注释
cron.* /var/log/cron.log
重启 rsyslog:
sudo rsyslogd -N1 && sudo systemctl restart rsyslog
之后 cron 的执行记录(什么时候跑了哪个任务)会写入 /var/log/cron.log。注意:这只记录 cron 守护进程的事件,脚本自身的输出仍需方式一或输出重定向。
查看
grep CRON /var/log/syslog # cron 守护进程记录
tail -f /var/log/cron.log # 独立 cron 日志(方式二)
如果多台主机都执行同类任务,可用 DataKit 文件采集读取上面的 syslog 或独立日志文件,在观测云中按主机与任务名查询。先执行一次可识别的测试任务,确认 logger 消息与脚本退出结果都已记录;只有 cron 的启动行,无法证明脚本成功完成。
常见问题(FAQ)
Q:cron 默认把输出发到哪?
A:发到本地邮件(需要 MTA)。系统没配邮件服务时输出直接丢弃——所以配日志很重要。
Q:logger 命令写的日志在哪个文件?
A:默认进 /var/log/syslog(Ubuntu/Debian)。想让特定标签进独立文件,在 /etc/rsyslog.d/ 加路由规则。
Q:systemd 定时器(timer)能替代 cron 吗?
A:能,且日志自动进 journald(journalctl -u myjob.service 查看任务服务输出,timer 单元记录调度事件),管理更现代。新系统可以考虑迁移。