发布于2026-08-17 阅读(0)
扫一扫,手机访问
这一步不能省:务必把stderr显式重定向出去,并把日志按结构化方式记录清楚,至少要带上时间戳、主机名、任务标识、错误详情和退出码。日志最好落到专用文件里,再配合logrotate做管理;同时还要确保日志路径使用绝对路径、权限设置无误,最终做到出了问题能查、查了能追、追溯链条完整。

定时任务最让运维头疼的,往往不是“完全没跑”,而是它其实已经执行了,只是中途出了错,异常却被悄无声息地吞了下去。说到底,真正的关键不在于“有没有日志”,而在于“错误有没有被明确捕获,并且实实在在写入日志文件”。
crontab 默认把 stderr 发到用户邮箱,但多数服务器没配邮件服务,结果就是错误彻底消失>> /path/to/log 2>&1 显式重定向,且路径必须绝对、目录存在、权限可写$? 判断上一条命令退出码,再写入结构化日志行,例如:echo "$(date '+%F %T') ERROR: rsync failed with code $?" >> /var/log/backup_alert.log
/dev/null 吞掉所有输出——哪怕只是临时调试,也至少先重定向到临时文件光记“失败”没用,得知道谁、什么时候、在哪台机器、因何失败。日志字段缺失会导致排查时间翻倍。
$(date '+%F %T'))、主机名($(hostname -s))、任务标识(如 mysql-backup)rsync,就捕获 rsync 的 stderr;如果是 tar,就检查 tar -tf 是否返回非零2026-07-09 04:02:15 web01 mysql-backup ERROR: No space left on device (exit=1)
logger 命令——它只进 /var/log/messages,不易单独过滤;专用日志文件 + logrotate 更可控连续失败反复记同一行日志,等于没记;但完全去重又可能漏掉关键变化。需要平衡。
df -h /backup | awk 'NR==2 {print $5}')OK 行,便于用 grep -B1 OK /var/log/backup_alert.log 快速定位上次失败终点touch -c /tmp/alert_lock_${task} && sleep 300 实现 per-task 静默期,比全局锁更精准日志写不进去,90% 是权限或路径问题,不是语法问题。
/var/log/backup_alert.log 所在目录需 chown root:backup /var/log/backup + chmod 750 /var/log/backup/tmp——部分系统定期清理,且无持久性保障;生产环境一律用 /var/log/ 下专用子目录sudo -u www-data bash),执行 echo test >> /var/log/backup/try.log,看是否 Permission deniedsetgid 目录 + 统一 group 写权限,比 chmod 777 安全得多
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
4
5
6
7
8
9