Ubuntu 20.04 中如何把 cron 任务的输出写入 syslog?

Ubuntu 上 cron 任务输出通常交给本地邮件;把脚本输出管道给 logger 可进入 syslog。rsyslog 的 cron 路由记录守护进程事件,不会自动收集任务输出。

最佳实践
Ubuntu 20.04 中如何把 cron 任务的输出写入 syslog?封面

两种方式:一、在 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 单元记录调度事件),管理更现代。新系统可以考虑迁移。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台