要让crontab日志不丢、可查、好归档,需整合重定向、路径管理、日志轮转和权限控制:用>>和2>&1追加记录,避免>覆盖;按日期动态命名(需/bin/bash支持);配合logrotate自动压缩归档;统一定义logdir等变量提升可维护性;必要时分离stdout/stderr并用logger接入系统日志。

想让 crontab 的输出不丢、可查、好归档,关键不是只写进一个文件,而是把重定向、路径管理、日志轮转和权限控制这几件事串起来做。
用 >> 和 2>&1 实现基础追加式记录
这是最常用也最稳妥的起点。crontab 默认会把 stdout 和 stderr 发到用户邮箱,但邮箱往往不可靠或未启用,直接重定向到文件更可控。
-
标准写法:在 crontab 条目末尾加上
>> /var/log/myjob.log 2>&1 -
注意路径可写:确保目标目录(如
/var/log/)对运行该任务的用户有写权限;若脚本以 root 运行,普通用户可能无法写入自己的 home 目录下的日志 -
别用 >:单个
>会每次覆盖日志,丢失历史;>>才是追加,适合长期运行的任务
按日期自动分割日志,避免单文件膨胀
每天生成一个新日志,既方便定位问题,也利于后续清理或压缩归档。
-
用 date 动态生成文件名:例如
0 2 * * * /path/script.sh >> /var/log/script_$(date +\%Y\%m\%d).log 2>&1 -
注意 shell 差异:crontab 默认使用
/bin/sh,不支持$()命令替换;需显式指定 bash 解释器:0 2 * * * /bin/bash -c '/path/script.sh >> /var/log/script_$(date +\%Y\%m\%d).log 2>&1' -
配合 logrotate 更省心:把日志路径加入
/etc/logrotate.d/配置,设定保留 30 天、自动 gzip 压缩等规则
统一日志路径与环境变量,减少硬编码
如果多个定时任务共用一套日志策略,集中配置比每行都写一遍更易维护。
-
在 crontab 文件顶部声明变量:编辑
crontab -e,开头加两行:LOGDIR=/var/log/myscripts<br>PATH=/sbin:/bin:/usr/sbin:/usr/bin
-
任务中直接引用:
0 * * * * /opt/bin/check.sh >> $LOGDIR/check.log 2>&1 - MAILTO="" 关闭邮件通知:防止 cron 在失败时尝试发信,避免因邮件服务未配而报错或静默丢日志
错误优先捕获:分离 stdout 与 stderr 更利于排查
有些场景下,你希望正常输出和报错信息分开看——比如 stdout 是采集的数据,stderr 才是真正的异常线索。
-
分别重定向到不同文件:
0 */6 * * * /srv/app/pull.sh > /var/log/pull.out 2> /var/log/pull.err -
stderr 单独告警:可在任务后加判断,例如:
0 */6 * * * /srv/app/pull.sh > /var/log/pull.out 2> /var/log/pull.err || echo "ERROR at $(date)" | logger -t pull_job - 用 logger 走系统日志:适合已有集中日志系统(如 rsyslog 或 journalctl)的环境,便于统一检索和监控











