脚本里 echo 的中文写进日志变成一串问号 date 输出的月份也成了英文缩写 同一份脚本手动执行完全正常。乍看像缓存或者权限的锅,追下去往往不是。
LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8 */5 * * * * /bin/bash /opt/jobs/report.sh locale
追下去是这么回事:cron 拉起的子进程只继承极少几个环境变量 LANG 和 LC_ALL 都是空的 默认落回 C 语言环境 中文按 ASCII 处理就变成了问号 和终端里完全不是一套。
「cron LANG 乱码」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。
具体做法是,在 crontab 顶部显式设置 LANG 和 LC_ALL 两个环境变量 别指望系统继承;脚本里再 export 一次 防止被上层或者其他配置覆盖掉同一个值;日志统一按 UTF-8 写 不要和 GBK 编码混在同一个日志文件里。
验收就看一点,新日志里中文正常显示 date 输出为中文格式 不再是 C 环境的结果。
